【问题标题】:Octave : fsolve function error八度:fsolve函数错误
【发布时间】:2016-12-12 04:42:21
【问题描述】:

我在使用fsolve 时遇到问题,程序向我发送错误消息,但我不知道为什么。我应该找到x(2) = 2.96e+13x(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 后出错:

提前谢谢

【问题讨论】:

  • 错误在哪里?我只能在图像中看到警告(这是个坏主意,你为什么不将输出添加为文本?)
  • 程序没有向我显示值为 x1 和 x2 的结果。我不知道如何将错误输出为文本。
  • 首先要做的是查看函数失败的值。使用OutputFcn 来实现这一点。

标签: octave


【解决方案1】:

我要做的第一件事是将调用更改为

[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。然后线性求解器返回

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

等等x(1) = -3.559e-33

这是一种疯狂的尺度差异,考虑到您的系数中有 3-5 个有效数字,这让人怀疑结果是否有意义。

【讨论】:

  • 非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多