八度:fsolve函数错误
Octave : fsolve function error
我在使用 fsolve
时遇到问题,程序向我发送错误,但我不知道为什么。我应该找到 x(2) = 2.96e+13
和 x(1)= 2.72e+22
。
我试过这个来解决我的非线性方程:我有 2 个方程和 2 个未知数:
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 后出错:
提前致谢
我要做的第一件事就是将调用更改为
[x,val,info]=fsolve("f",[1e+22;1e13],options)
并尝试各种选择。在此示例中,很容易通过分析找到 f 的雅可比行列式,因此我将其作为 f
的第二个输出提供,并输入 options.Jacobian="on"
另一个可能有用的选项是 AutoScaling = "on" , 来处理不同尺度的变量。
但是这些在具体的例子中并没有多大帮助,因为它的缩放真的很糟糕。以下是方程式的实际内容:
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
。然后是线性求解器returns
z = 96810.712
x(2) = -2.720e+22
等等 x(1) = -3.559e-33
这是一种疯狂的比例差异,考虑到您的系数中有 3-5 位有效数字,这让人怀疑结果是否有意义。
我在使用 fsolve
时遇到问题,程序向我发送错误,但我不知道为什么。我应该找到 x(2) = 2.96e+13
和 x(1)= 2.72e+22
。
我试过这个来解决我的非线性方程:我有 2 个方程和 2 个未知数:
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 后出错:
提前致谢
我要做的第一件事就是将调用更改为
[x,val,info]=fsolve("f",[1e+22;1e13],options)
并尝试各种选择。在此示例中,很容易通过分析找到 f 的雅可比行列式,因此我将其作为 f
的第二个输出提供,并输入 options.Jacobian="on"
另一个可能有用的选项是 AutoScaling = "on" , 来处理不同尺度的变量。
但是这些在具体的例子中并没有多大帮助,因为它的缩放真的很糟糕。以下是方程式的实际内容:
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
。然后是线性求解器returns
z = 96810.712
x(2) = -2.720e+22
等等 x(1) = -3.559e-33
这是一种疯狂的比例差异,考虑到您的系数中有 3-5 位有效数字,这让人怀疑结果是否有意义。