matlab在使用ode45时警告: 积分公差要求无法满足。

matlab在使用ode45时警告:在t=9.188997e-01处失败.在时间t处,若不将步长降至允许的最小值(1.776357e-15)以下,积分公差要求无法满足。这... matlab在使用ode45时警告: 在 t=9.188997e-01 处失败.在时间 t 处,若不将步长降至允许的最小值(1.776357e-15)以下,积分公差要求无法满足。这个问题该如何解决? 展开
 我来答
妲己玩儿坏了
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就是正确的体积了

具体除以多少是根据变化较小的那个确定的,在这个瞎写假设的情境中,温度变化是几十,那体积除以某个数后也应该是几十到几百。

把这个方法套到你的方程中,把某个数缩小或者放大,应该就能解决问题了。

lhmhz
高粉答主

推荐于2018-03-05 · 专注matlab等在各领域中的应用。
lhmhz
采纳数:7264 获赞数:17015

向TA提问 私信TA
展开全部

由于ode45()函数主要处理非刚性微分方程问题,当积分公差要求无法满足时,可以考虑ode15s()函数(主要处理刚性的微分方程问题)或odesolve()函数。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-12-10
展开全部
换个仿真算法,ode3啊什么的,挨个试试。
如果还不行,也许是你仿真的东西变化太快,比如0.000000001秒就变了100000000,那就会报错了。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
进口的高考吧
2023-12-19
知道答主
回答量:1
采纳率:0%
帮助的人:165
展开全部
有可能是数据变量的步长太粗导致也就是数据量比较小导致的 减小步长增加数据量能解决一部分问题,具体根据详细情况来定
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式