采用fsolve求数值解,最终精度达不到0.01就停止,如何改进代码使得函数值的终止容限为0.01

img

采用fsolve求解L,A,B的数值解;所得数值解精确度远大于0.01,理论上L数量级在1e-3,A数量级在1e-42,B数量级在1e-18

问题相关代码
clear;clc;
va=1775;
T1=4;
T2=300;
T3=100;
hbar=1.05457266e-34;
k=1.3806505e-23;
% l = x1, a = x2, b = x3  t=x4
f = @(x)[(k./(2*((pi)^2).*va)).*((k./hbar).^3).*(T1.^3).*integral(@(t)(t.^4).*exp(t)./(((1e3*va./x(1))+(1e-42*x(2).*(k.*T1./hbar).^4.*(t.^4))+(1e-18*x(3).*T1.*exp(-203./(3*T1)).*(k.*T1./hbar).^2.*t.^2)).*((exp(t)-1).^2)),0,38.75)-66.3478;
    (k./(2*((pi)^2).*va)).*((k./hbar).^3).*(T2.^3).*integral(@(t)(t.^4).*exp(t)./(((va./x(1))+(x(2).*(k.*T2./hbar).^4.*(t.^4))+(x(3).*T2.*exp(-203./(3*T2)).*(k.*T2./hbar).^2.*t.^2)).*((exp(t)-1).^2)),0,0.5167)-1.4602;
    (k./(2*((pi)^2).*va)).*((k./hbar).^3).*(T3.^3).*integral(@(t)(t.^4).*exp(t)./(((va./x(1))+(x(2).*(k.*T3./hbar).^4.*(t.^4))+(x(3).*T2.*exp(-203./(3*T3)).*(k.*T3./hbar).^2.*t.^2)).*((exp(t)-1).^2)),0,1.55)-4.3545];
options = optimset('Display','iter','TolFun',1e-2,'TolX',0.5e-2,'MaxFunEvals',1e20,'LargeScale','on'); 
%TolFun – 函数值的终止容限:当迭代所得函数值小于此容限时即认为结果收敛,停止运算。
% TolX – x处的终止容限:当迭代所得函数值小于此容限时即认为结果收敛,停止运算
x = fsolve(f,[3.45,7.5,18],options);
disp(x);
运行结果及报错内容

img


最终结果f(x)迭代到21.0939就结束了,达不到想要的精度

我想要达到的结果

如何改进代码,使得函数所得精度小于等于0.01

fslove 不是万能的,特别是你给出的这样复杂的方程,可能是病态的而不能用导数方法求解。
建议做几个尝试:
(1)把等式右侧前 3项 移项到左侧,即右侧只保留积分项;
(2)fslove 选择 单纯性方法 优化。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632