我正在尝试计算两个浮点之间的积分。程序可以做到这一点,但它会发送下一条消息
警告:将浮点值传递给 sym 是危险的,请参阅“help sym”
这是我的代码
i=2.5;
syms x y
f=((2*x-1)/10)*((2*y-1)/10)/(x+y);
variable=double(int(int(f,x,i,1),y,i,1));
有什么办法可以做到而不那么不方便吗?
我认为你最后会转换为 double ,因为你得到了另一个问题的答案:有人可以解释 Octave 中 fprintf() 上的这个错误吗?,其中建议将你的答案转换为 double ,以便你可以将其传递给 fprintf。
Octave 向您发出有关组合浮点类型和符号数字的警告。这是一个潜在的问题,因为符号数是“精确”存储的,而浮点数可能不是,具体取决于它们的值。但这只是一个警告。不推荐,但您可以禁用警告。请参阅https://docs.octave.org/latest/Enabling-and-Disabling-Warnings.html
出现此问题是因为您在积分限制中使用了浮点值 2.5。为了避免这个问题,请将其定义为符号值:
pkg load symbolic;
syms x, y;
i = sym("2.5")
i = (sym) 5/2
variable = int(int(f,x,i,1),y,i,1)
variable = (sym)
11*log(5) log(2) 33 28*log(7/2)
- --------- - ------ + --- + -----------
30 150 200 75
variable = double (variable)
variable = 0.037950
正如上面评论中所建议的,如果您不需要问题的符号答案,并且您立即将其转换为浮点数,您可能会发现进行数字积分更容易。可以按如下方式解决您的问题:
# define equation as a function. Note use of .* and ./ 'elementwise'
# operators to avoid unwanted matrix multiplication/division.
f = @(x,y) ((2*x-1)/10).*((2*y-1)/10)./(x+y);
# Solve the 2D integral, returning a numeric result
variable = integral2 (f, 2.5, 1, 2.5, 1)
variable = 0.037950