Octave:fsolve函数错误

时间:2016-12-02 13:23:54

标签: octave

我使用fsolve时遇到问题,程序发给我一个错误,但我不知道为什么。我应该找到x(2) = 2.96e+13x(1)= 2.72e+22。 我试过这个来解决我的非线性方程:我有2个方程和2个unknows:

function y = f(x)

global x_rayon_droite
global z1
global r_droite
global x_rayon_gauche
global r_gauche
global y_rayon_droite
global y_rayon_gauche

x_rayon_droite=406
z1=2.72e+22
r_droite = 556.77
x_rayon_gauche=179
r_gauche = 241.42
y_rayon_droite=381
y_rayon_gauche=162


y(1)= x(1).*(x_rayon_droite./z1-x(2)./r_droite.*x_rayon_droite./r_droite)-x(1).*(x_rayon_gauche./z1-x(2)./r_gauche.*x_rayon_gauche./r_gauche)+x_rayon_droite-x_rayon_gauche;
y(2)= x(1).*(y_rayon_droite./z1-x(2)./r_droite.*y_rayon_droite./r_droite)-x(1).*(y_rayon_gauche./z1-x(2)./r_gauche.*y_rayon_gauche./r_gauche)+y_rayon_droite-y_rayon_gauche;

endfunction

[x,info]=fsolve("f",[1e+22;1e13])

使用fsolve后出错:

Error after using fsolve

提前谢谢

1 个答案:

答案 0 :(得分:0)

我要做的第一件事就是将呼叫改为

[x,val,info]=fsolve("f",[1e+22;1e13],options)

并尝试选项。在这个例子中,很容易从分析中找到f的雅可比行列式,所以我将其作为f的第二个输出提供,并放置options.Jacobian="on"另一个可能有用的选项是AutoScaling =“on”,to处理不同尺度的变量。

但是这些在具体的例子中没有多大帮助,因为它实际上非常难以扩展。这是方程实际上是什么:

0.0017615*x(1)*x(2) + (8.346e-21)*x(1) = -227
0.0015505*x(1)*x(2) + (8.051e-21)*x(1) = -219

如果引入新变量z = x(1)* x(2),这将成为线性系统。但即使作为一个线性系统,它的缩放比解算器可能放弃的还要严重。相反,我们引入z = (1e+15)*x(1)*x(2),相当于将第一列乘以1e-15。然后线性解算器返回

z = 96810.712  
x(2) = -2.720e+22  

所以x(1) = -3.559e-33

这是一种疯狂的比例差异,这让人怀疑结果是否有意义,因为你的系数中有3-5个有效数字。