fsolve求解非线性方程组
我的程序,总有这样那样的问题,最终还是会出现错误
M文件:
function F=myfunfsolve(x)
Iph=x(1);
I0=x(2);
Rs=x(3);
Rp=x(4);
Vt=x(5);
Voc=44.6/72;
Vm=35.4/72;
Isc=5.43;
Im=4.95;
Ns=1;
Np=1;
q=1.602E-19;
K=1.381E-23;
Alpha=0.0008;
beita=-0.145;
T0=298.15;
T01=323.15;
Eg0=1.16-7.02e-4*T0^2/(T0-1108);
Eg01=1.16-7.02e-4*T01^2/(T01-1108);
I01bi=T01^3/T0^3*exp(q*Eg0/(Vt)-q*T0*Eg01/(Vt));
F=[Np*Iph-Np*I0*(exp(Voc/Ns/Vt)-1)-Np/Ns*Voc/Rp;
Np*Iph-Np*I0*(exp(Isc*Rs/Np/Vt)-1)-Isc*Rs/Rp-Isc;
Np*Iph-Np*I0*(exp((Vm/Ns+Im/Np*Rs)/Vt)-1)-Np*(Vm/Ns+Im/Np*Rs)/Rp-Im;
(Np/Ns/Vt*I0*exp((Vm+Im*Ns/Np*Rs)/Ns/Vt)+1/(Ns/Np*Rp))/(1+Rs/Vt*I0*exp((Vm+Im*Ns/Np*Rs)/Ns/Vt)+Rs/Rp)-Im/Vm;
(-Np/Ns/Vt*I0*exp(Isc*Ns*Rs/Np/Ns/Vt)-1/(Ns/Np*Rp))/(1+Rs/Vt*I0*exp(Isc*Ns*Rs/Np/Ns/Vt)+Rs/Rp)+1/Rp;
Np*Iph*(1+(T01-T0)*Alpha/Isc)-Np*I0*I01bi*(exp(Voc*(1+(T01-T0)*beita/Voc)/Ns/Vt*T0/T01)-1)-Np/Ns*Voc*(1+(T01-T0)*beita/Voc)/Rp];
命令行输入:
clear;
x0 = [5.4 2e-9 0.02 2 0.05]; % Make a starting guess at the solution
options=optimset('Display','iter','TolFun',1e-3,'TolX',1e-100,'Algorithm','levenberg-marquardt', 'MaxIter',1e4,'MaxFunEvals',1e5,'Diagnostics','on'); %option to display output
[x,fval] = fsolve(@myfunfsolve5,x0,options); % Call solver
出现下列提示:
No solution found.
fsolve stopped because the problem appears regular as measured by the gradient,
but the vector of function values is not near zero as measured by the
selected value of the function tolerance.
我就不知道该如何处理了,如何才能得到解,顺便说一声,这个应该有前人的正确解,[5.449 1.2e-9 0.092 2.725 0.028] 返回小木虫查看更多
得到的解是【-0.076195037566324 -0.000000573386969 -2.251437071748727 2.440695364463143 0.046798441863606】 请查看方程并确认是否写正确了,估计是你写错了方程
方程已经过了无数次的检查,而且将前人迭代的正确解反带入原档程,几乎每个式子都在0附近
6个方程5个未知数,本身就不存在精确解吧。
而且,所谓的“这个应该有前人的正确解,[5.449 1.2e-9 0.092 2.725 0.028]”,带回原方程验证,误差是非常之大,下面随便一组近似解都要比这个“正解”好的多:
iph: -2.44512940626882E-8
i0: 234876089.693707
rs: 2.65964117382912E15
rp: 2.01138445074181E24
vt: -6.24686104906122E23,