模拟常微分方程与数组输入

3视图(30天)
默罕默德Jibran Ejaz
默罕默德Jibran Ejaz 2019年4月29日
评论道: 1月 2019年4月29日
我有一个我想模拟方程:
计算出的P是以下方程:
我试着如下的代码:
清晰的所有;关闭所有;clc
T_o =[25 26日24日23日22日21日22日23日24日26日27 28 29 30 31 32 31日29日29日27日26日25日24日22);
T_in = 26;
η= 2.6;
R = 5.56;
P_avg = (T_out - T_in) /(η* R);
P_avg (T_out < = T_in) = 0;
P_avg (T_out > = T_in + 2) = 1490;
t = 1:长度(T_o);
y0 = 28;
P = P_avg;
[T Y] =数值(@ (T, Y) first_order (T, Y, P, T_o), T, y0);
这个函数我定义如下:
函数dydt = first_order (t, y, P, T_o)
%函数dydt = first_order (t、y、fP fT_o)
% P = interp1 (fP, t, t);
% T_o = interp1 (fT_o, t, t);
R = 5.56;
η= 2.6;
C = 0.18;
dydt =(η* P + (T_o-y) / R) / C;
结束
命令窗口给出了以下错误:
错误使用odearguments(第90行)
@ (T, Y) FIRST_ORDER (T、Y, P, T_O)必须的返回一个列向量。
错误在数值(第113行)
[neq tspan ntspan,接下来,t0, tfinal, tdir, y0, f0, odeArgs, odeFcn,
模拟误差(25)行
[T Y] =数值(@ (T, Y) first_order (T, Y, P, T_o), T, y0);
当我尝试与单个值的代码,它将正常工作。但是试图通过整个一系列T_o和P,它崩溃并生成上述错误。我有尝试的解决方案 //www.tianjin-qmedu.com/help/matlab/ref/ode45.html的例子
正如你所看到的在评论部分但是我不能使它工作。任何帮助将不胜感激;

接受的答案

Stephane Dauvillier
Stephane Dauvillier 2019年4月29日
编辑:1月 2019年4月29日
你好,我不确定你正确使用数值。
在你的函数 dydt = first_order (t, y, P, T_o)
t当前时间和y的当前值,P和T_o是你的函数的参数。
这意味着它不会只等于1或2或....或长度(T_o)。
如果我理解正确的参数P和T_o取决于t P和T_o应该功能。
所以在你的主要代码,你可能想要这样的:
fcnTout = @(时间)interp1 (t, T_out、时间);
fcnP = @(时间)interp1 (t, P_avg、时间);
[T、Y] =数值(@ (T, Y) first_order (T Y fcnP fcnTout), T, y0);
人物,情节(T、Y);%,看看结果
和在你first_order功能:
dydt =(η* P (t) + (t (t)_o-y) / C / R);
解决你的问题吗?
2的评论
1月
1月 2019年4月29日
线性插值的参数还不光滑。而 数值 可能计算终值、积分电路驱动除了规范。数值模拟的一个科学问题,这是不可靠的。

登录置评。

答案(1)

1月
1月 2019年4月29日
编辑:1月 2019年4月29日
当然,集成商必须崩溃。检查维度:使用的大小
dydt =(η* P + (T_o-y) / R) / C;
当你的参数定义为行向量?隐式创建矩阵扩张,错误消息告诉你,功能被集成的输出必须是列向量。
你并没有提到,你想实现什么样的目标。我猜, T_o 是一个参数,每秒钟cheang其价值。然后 first_order () 是一个模型的函数,而不是与Matlab的颂歌集成商兼容。记住,数值是专为光滑函数,否则stepsize控制器驱动的规范。计算积分可以由舍入或discreatization论述,等,它是有用的作为一个随机值。不做科学工作。
如果参数是在不同的时间间隔改变,你必须集成在这些间隔运行,使用一个间隔的最终值作为初始值的下一个:
T_o =[25 26日24日23日22日21日22日23日24日26日27 28 29 30 31 32 31日29日29日27日26日25日24日22);
t = 1:长度(T_o);
allT = 1;
盟友= y0;
= 1:长度(T_o)
aT_o = T_o(它);
t =;
[T、Y] =数值(@ (T, Y) first_order (T, Y, P, T_o (T)), (T, T + 1), y0);
allT = [allT;T (2)):;
盟友=[盟友;Y (2:,:)];
y0 = Y(最终:);
结束

类别

找到更多的在编程帮助中心文件交换

s manbetx 845


释放

R2015a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!