首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >倍频程:解决函数错误

倍频程:解决函数错误
EN

Stack Overflow用户
提问于 2016-12-02 13:23:53
回答 1查看 532关注 0票数 0

当我使用fsolve时,程序会给我发送一个错误,但是我不知道为什么。我应该去找x(2) = 2.96e+13x(1)= 2.72e+22。我试着用这个来解我的非线性方程:我有两个方程,两个不知道:

代码语言:javascript
复制
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后出错:

Thx预先

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-11 20:42:21

我要做的第一件事就是把电话改到

代码语言:javascript
复制
[x,val,info]=fsolve("f",[1e+22;1e13],options)

并尝试各种选择。在这个例子中,很容易解析地找到f的Jacobian,所以我会提供它作为f的第二个输出,并将options.Jacobian="on"另一个可能有用的选项是AutoScaling = "on",用于处理不同尺度的变量。

但在具体的例子中,这些并没有多大帮助,因为它的规模实在太大了。下面是方程的实际内容:

代码语言:javascript
复制
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。然后线性求解器返回。

代码语言:javascript
复制
z = 96810.712  
x(2) = -2.720e+22  

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40933254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档