回 帖 发 新 帖 刷新版面

主题:关于用fsolve求解方程的问题

我用fsolve求解代码中的超越方程得到的解与用fzero得到的解差别很大,我通过改变初值,fzero求解的根很稳定(需要的根),可是fsolve却不稳定,这是怎么回事,我该如何处理能够得到理想的解,请高手明示很困扰!(实际上我要求解的是方程组所以必须用fsolve不能用fzero)
clear all;clc;close all;
global T 
format long
n0=[0.04];
options=optimset('display','on');
T=1;
[n(1,:),fval,exitflag]=fsolve(@myfun,n0,options)

function y=myfun(n)
global T
x=n(1);
y=zeros(1,1);
w=sqrt(1+(6*x)^2);
y(1)=(3*x/w)*tanh(w/(2*T/log(2)))-x;

回复列表 (共5个回复)

沙发

这个也是我的头疼的问题。我一般是改变TolFun和TolX参数,其中改变TolFun参数比较有效
clear all;clc;close all;
global T 
format long
n0=[0.04];
options=optimset('display','on');
options.TolFun=1e-30;           %%%加上这两句
options.TolX=1e-16;             %%%
T=1;
[n(1,:),fval,exitflag]=fsolve(@myfun,n0,options)


板凳

楼上我加上那两句了,可是还是不行,该如何调节这两项能使其更合适,以致得到合适的解呢,有人说减小允许误差,这该调节什么参数呢,我查了一下没找到呀?

3 楼

针对具体的方程TolX和TolFun是如何选取的 options.TolFun=1e-30;options.TolX=1e16这两项的数值是如何选取的呢?

4 楼

[quote]针对具体的方程TolX和TolFun是如何选取的 options.TolFun=1e-30;options.TolX=1e16这两项的数值是如何选取的呢?[/quote]
TolFun:误差函数误差控制量,当函数的绝对值小于此值时即终止求解
TolX:解的误差限控制量,当解的绝对值小于此值时终止求解

所以这两个值给得越小,解的精度就越高,但运算就越久。
你说的不行是不是你把Tolx误赋值为1e16了?少了个负号。

5 楼

我发现对于一个方程处理起来还可以,可是对于方程组,似乎就不行了,例如如下的代码,得到的解是零,而真解不是零。
clear all;clc;close all;
global T 
n0=100*ones(1,5);
T_par=0.981;
options=optimset('display','on');
options=optimset('TolFun',1e-30,'TolX',1e-30);
T=T_par(1);
[n(1,:),fval,exitflag]=fsolve(@myfun,n0,options)

function y=myfun(n)
global T
q=1;
k=1;
ja1=0.5253;
ja2=1;
ja3=1;
je1=0.4202;
je2=1;
je3=1;
p1=n(1);
p2=n(2);
p3=n(3);
p4=n(4);
p5=n(5);
t1=0;
t2=0;
t3=0;
t4=0;
t5=0;
dt1=-4*ja1*p1-je1*p2;
dt2=-4*ja2*p2-je1*p1-je2*p3;
dt3=-4*ja3*p3-je3*p4-je2*p2;
dt4=-4*p4-je3*p3-1.0*p5;
dt5=-4*p5-1.0*p4-1.0*p5;
w1=q;
w2=q;
w3=q;
w4=q;
w5=q;
th1=tanh(w1*log(2)/(2*k*T));
th2=tanh(w2*log(2)/(2*k*T));
th3=tanh(w3*log(2)/(2*k*T));
th4=tanh(w4*log(2)/(2*k*T));
th5=tanh(w5*log(2)/(2*k*T));
y(1)=dt1*q^2/(2*w1^3)*th1+(t1^2*dt1*T/log(2)-w1^2*t1)*(1-th1^2)*log(2)*log(2)/(4*k*T*T*w1^2)+p1;
y(2)=dt2*q^2/(2*w2^3)*th2+(t2^2*dt2*T/log(2)-w2^2*t2)*(1-th2^2)*log(2)*log(2)/(4*k*T*T*w2^2)+p2;
y(3)=dt3*q^2/(2*w3^3)*th3+(t3^2*dt3*T/log(2)-w3^2*t3)*(1-th3^2)*log(2)*log(2)/(4*k*T*T*w3^2)+p3;
y(4)=dt4*q^2/(2*w4^3)*th4+(t4^2*dt4*T/log(2)-w4^2*t4)*(1-th4^2)*log(2)*log(2)/(4*k*T*T*w4^2)+p4;
y(5)=dt5*q^2/(2*w5^3)*th5+(t5^2*dt5*T/log(2)-w5^2*t5)*(1-th5^2)*log(2)*log(2)/(4*k*T*T*w5^2)+p5;

我来回复

您尚未登录,请登录后再回复。点此登录或注册