浮点之间的 Octave 积分

问题描述 投票:0回答:1

我正在尝试计算两个浮点之间的积分。程序可以做到这一点,但它会发送下一条消息

警告:将浮点值传递给 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 warnings integration octave sym
1个回答
0
投票

我认为你最后会转换为 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
© www.soinside.com 2019 - 2024. All rights reserved.