matlab在使用ode45时警告: 积分公差要求无法满足。
你计算的公式应该是变量不只一个,然后两个数值差的比较大,导致经过相同的时间,两参数数值变化过大。比如说如下式子
Dx=@(t,x)[(x(1)-123*x(2)));
(x(2)-1234*x(1))];
[a,x]= ode45(Dx,,[0 36000],[80 3000]);
x=x(end,:)
t1=@(t)v(t)-150000; %%%%v(t)是计算t时刻储气室体积的函数
t_zong=fzero(t1,10000) %%%%求函数t1在t=10000附近的零点
这个瞎写的式子中,假设正确的结果是总时间t_zong=3600秒,即1个小时,x(1)代表温度,开始为80,1个小时后为160;x(2)代表一个储气室的体积,开始为2500立方米,1个小时后为15万立方米。那么输出结果应该为:
x=(160 150000)
t_zong=3600
这样的话,3600秒内x(1)才变化80,而x(2)会变化十几万,相差太大,程序很容易报上面你写的那个警告,无法运算下去。
那怎么解决呢?
很简单,把x(2)看成体积除以1000,算出来结果后,分别将x(2)中的各数值乘以1000就是你要算的数,即:
Dx=@(t,x)[(x(1)-123*x(2)*1000));
(x(2)*1000-1234*x(1))];
[a,x]= ode45(Dx,,[0 36000],[80 3]);
x=x(end,:)
t1=@(t)v(t)-150; %%%%v(t)是计算t时刻储气室体积的函数
t_zong=fzero(t1,10000) %%%%求函数t1在t=10000附近的零点
最后就应该能计算出结果了,结果应该是:
x=(160 150)
t_zong=3600
最后再把150乘上1000就是正确的体积了
具体除以多少是根据变化较小的那个确定的,在这个瞎写假设的情境中,温度变化是几十,那体积除以某个数后也应该是几十到几百。
把这个方法套到你的方程中,把某个数缩小或者放大,应该就能解决问题了。
由于ode45()函数主要处理非刚性的微分方程问题,当积分公差要求无法满足时,可以考虑ode15s()函数(主要处理刚性的微分方程问题)或odesolve()函数。
2015-12-10
如果还不行,也许是你仿真的东西变化太快,比如0.000000001秒就变了100000000,那就会报错了。