prudentL 2022-02-15 23:20 采纳率: 100%
浏览 38
已结题

采用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

  • 写回答

2条回答 默认 最新

  • youcans_ 人工智能领域优质创作者 2022-02-16 21:15
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月26日
  • 已采纳回答 2月18日
  • 创建了问题 2月15日

悬赏问题

  • ¥66 定制开发肯德基自动化网站下单软件
  • ¥20 vscode虚拟环境依赖包未安装
  • ¥15 odoo17关于owl开发js代码问题
  • ¥15 光纤中多普勒频移公式的推导
  • ¥15 怎么制作一个人脸识别门禁系统
  • ¥20 大华dss监控平台网络关闭登不进去
  • ¥15 请使用蚁群算法解决下列问题,并给出我完整的代码
  • ¥20 关于php录入完成后,批量更新数据库
  • ¥15 请教往复密封润滑问题
  • ¥15 cocos creator发布ios包