您好,我在使用ode45时也出现了类似的警告,请问,您当时怎么解决这个问题的,谢谢啦

警告:在t=5.122023e+00处失败。在时间t处,若不将步长降至允许的最小值(1.421085e-14)以下,积分公差要求无法满足。... 警告: 在 t=5.122023e+00 处失败。在时间 t 处,若不将步长降至允许的最小值(1.421085e-14)以下,积分公差要求无法满足。 展开
 我来答
妲己玩儿坏了
2019-02-21 · 超过18用户采纳过TA的回答
知道答主
回答量:62
采纳率:0%
帮助的人:5.1万
展开全部
你计算的公式应该是变量不只一个,然后两个变量的数值差的比较大,导致经过相同的时间,两参数数值变化过大。比如说如下式子
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就是正确的体积了
具体除以多少是根据变化较小的那个确定的,在这个瞎写假设的情境中,温度变化是几十,那体积除以某个数后也应该是几十到几百。
把这个方法套到你的方程中,把某个数缩小或者放大,应该就能解决问题了。
山水阿锐
2015-04-07 · TA获得超过34.3万个赞
知道顶级答主
回答量:23.7万
采纳率:91%
帮助的人:3.2亿
展开全部
您好,是这样的:
提示是说你的model里面不连续,应该使用VariableStepDiscrete仿真模式,而不是ode45模式。
有两种更改方法:
1、在该model的工具栏上选择simulation,再选择并进入configuration parameters界面,从solver里面设置,type设置为variable-step,solver设置为discrete;
2、或者在Diagnostics子菜单里将'Automatic solver parameter selection' 设置为none。
追问
好像不行呢,我是在matlab中使用Runge-kutta迭代方法求方程组的数值解,不是仿真中用的。。。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式