您好,我在使用ode45时也出现了类似的警告,请问,您当时怎么解决这个问题的,谢谢啦
发布网友
发布时间:2022-03-24 18:54
我来回答
共2个回答
热心网友
时间:2022-03-24 20:23
你计算的公式应该是变量不只一个,然后两个变量的数值差的比较大,导致经过相同的时间,两参数数值变化过大。比如说如下式子
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就是正确的体积了
具体除以多少是根据变化较小的那个确定的,在这个瞎写假设的情境中,温度变化是几十,那体积除以某个数后也应该是几十到几百。
把这个方法套到你的方程中,把某个数缩小或者放大,应该就能解决问题了。
热心网友
时间:2022-03-24 21:41
您好,是这样的:
提示是说你的model里面不连续,应该使用VariableStepDiscrete仿真模式,而不是ode45模式。
有两种更改方法:
1、在该model的工具栏上选择simulation,再选择并进入configuration parameters界面,从solver里面设置,type设置为variable-step,solver设置为discrete;
2、或者在Diagnostics子菜单里将'Automatic solver parameter selection' 设置为none。追问好像不行呢,我是在matlab中使用Runge-kutta迭代方法求方程组的数值解,不是仿真中用的。。。