我想使用matlab中fsolve函数求解方程组,但是初始值不同时计算结果也不同,计算结果也不对,为什么? 50
我的matlab程序如下:functiona=myfun(m)E=1e12;t=0.34e-9;C1=0.524;T=0.2;h=0.25e-6;a0=2e-6;pe=8...
我的matlab程序如下:
function a = myfun(m)
E=1e12;t=0.34e-9;C1=0.524;T=0.2;h=0.25e-6;a0=2e-6;pe=8.3e4;S0=0.15;v=0.16;p0=1.937e6;
V0=3.14*h*a0^2;
a2=m(1);
w2=m(2);
a(1)=(4*w2/a2^2*(S0+2*E*t*w2^2/(3*a2^2*(1-v)))+pe)*(V0+C1*3.14*a2^2*w2)-p0*V0;
a(2)=-12*C1*3.14*w2^2*S0/a2+8*C1*3.14*E*t*S0*w2^4/(3*S0*a2^3*(1-v)+6*E*t*w2^2*a2)-...
20*C1*3.14*E*t*w2^4/(3*a2^3*(1-v))+2*3.14*T*a2;
end
求解主函数如下:
clc;clear;
x=fsolve('myfun',[2e-6,250e-9]) 展开
function a = myfun(m)
E=1e12;t=0.34e-9;C1=0.524;T=0.2;h=0.25e-6;a0=2e-6;pe=8.3e4;S0=0.15;v=0.16;p0=1.937e6;
V0=3.14*h*a0^2;
a2=m(1);
w2=m(2);
a(1)=(4*w2/a2^2*(S0+2*E*t*w2^2/(3*a2^2*(1-v)))+pe)*(V0+C1*3.14*a2^2*w2)-p0*V0;
a(2)=-12*C1*3.14*w2^2*S0/a2+8*C1*3.14*E*t*S0*w2^4/(3*S0*a2^3*(1-v)+6*E*t*w2^2*a2)-...
20*C1*3.14*E*t*w2^4/(3*a2^3*(1-v))+2*3.14*T*a2;
end
求解主函数如下:
clc;clear;
x=fsolve('myfun',[2e-6,250e-9]) 展开
1个回答
展开全部
[x,fval,exitflag]=fsolve(fun,x0)
你可以利用fsolve函数多返回两个信息
一个是返回的x对应的函数值fval,一个是函数返回状态exitflag
fsolve也不是万能的,不是对所有的函数都能找到解
特别是你的初值选取离正确解很远的时候
或者是函数比较多奇异点,不连续点
又或者选取的精度不合理
很可能找不到正确解的解,得到的x不是正确的
又或者问题太复杂,在经过设定的最大计算步数后,还没收敛到正确解
这个时候你可以利用fval和exitflag判断返回的解是否正确有效
fval对应的是返回的x值是,原来函数的值
如果x是正确解,那么得到的fval应该都满足误差要求,是很接近零的值
而exitflag是更直接地获得返回信息的标志
当返回的exitflag等于1时,是最后的情况,表明找到了符合精度要求的解
如果exitflag不等于1,就表明有一定的问题,解x不太可信,或者根本即使错误的
以下是exitflag返回值对应的所有意义
你可以多让fsolve返回这两个信息,然后根据它们判断时候得到正确解
如果得不到正确解
那么可以尝试更换初值
更改误差要求或者最大计算步数
追问
计算结果与真实值a2=2e-6,w2=2.61e-7有偏差
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询