Matlab 组合for循环/while循环和ODE45
我想知道是否可以将Matlab 组合for循环/while循环和ODE45,matlab,ode,Matlab,Ode,我想知道是否可以将for loops/while loops和ODE45结合起来,请看下面的示例: 我有一个函数(ode),我想在不同的ic(初始条件)下求解: 并在末尾绘制溶液曲线 有没有一种方法可以在不手动操作的情况下传递另一个ic,比如循环?或者用其他方法来优化这个步骤?如果我能在这方面得到一些帮助,我将非常感激,因为我必须在15到25个不同的ic上计算许多ODE(更复杂的ODE) 提前谢谢 注:如果代码必须更改(例如x0s或解决方案x_t的不同名称),则可以 如果您有预定义数量的ic,您
for loops/while loops和ODE45
结合起来,请看下面的示例:
我有一个函数(ode),我想在不同的ic
(初始条件)下求解:
并在末尾绘制溶液曲线
有没有一种方法可以在不手动操作的情况下传递另一个ic
,比如循环?或者用其他方法来优化这个步骤?如果我能在这方面得到一些帮助,我将非常感激,因为我必须在15到25个不同的ic
上计算许多ODE
(更复杂的ODE)
提前谢谢
注:如果代码必须更改(例如x0
s或解决方案x_t
的不同名称),则可以 如果您有预定义数量的ic
,您可以将其用于循环:
for i=1:NoOfic
test_mat(i,:)=test_ode_45(x(i),tspan);
end
您应该在足够的维度中预定义矩阵(test_mat),例如
test_mat = zeros(NoOfic, SizeOftspan)
显然,我已经将变量NoOfic
和SizeOftspan
定义为特定的数字
我的整个测试代码是:
tspan = 1:0.02:2;
x= [0.4 0.8 1.2 1.5 2.6];
sizeOftspan = size(tspan);
sizeOfFamily= size(x);
test_mat = zeros(sizeOfFamily(2),sizeOftspan(2));
test_tes= test_ode_45(x(1),tspan);
for i=1:sizeOfFamily(2)
test_mat(i,:)=test_ode_45(x(i),tspan);
end
plot(tspan, test_mat)
其中,我的test_ode_45
函数是一个简单的x*sin(t)函数我说得对,你想画一系列函数f_x(t)。族参数x在数组中的位置?如果是这样的话,您可以将数据传输到matrix.Hi@Minion,打印部分实际上不那么重要。你能再多说一点关于如何将值传递到矩阵吗?或者它会是什么样子?我在考虑一个矩阵,在你给出的示例代码中,它有6行51列。表示上述x0值之一的每一行和表示tspan的列。然后你可以直接绘图(tspan,Matrix)很抱歉这么慢,但是我知道x0s
可以生成一个向量X0
,它是(6x1),我看到另一个向量(比如说T
)由tspan
构成,它将是T=(1x51)
但如何形成这两个向量的矩阵
,这如何帮助我解决问题?而且,如果我向matlab
展示一个包含n
初始条件的向量(这次是6),那么matlab
会不会认为我传递的是一个ODE系统,而不仅仅是一个ODE?我发布了一个循环,应该可以实现这一点。在这个循环中,我计算为x(i)
编程的test\u ode\u 45
-函数和所有tspan
元素,并将结果保存在测试表的第i行。最后,您可以使用绘图(tspan,test\u mat)
进行绘图。太棒了!感谢@Minion提供的可视示例,我现在明白了!并且,来自test\u mat
的每个行
对应于一个时间序列
/解决方案
对吗?还是每个列都是?这取决于您的实现。如果你像我那样做,每一行代表一个时间序列(51个元素)。但是您可以很容易地更改代码以转置它。只需记住更改test\u mat
的定义以及循环索引在matrix@Minion我相信我做错了什么,但我看不出错误在哪里。我使用了你的代码,只是修改了一点,包括一个句柄函数
,我注意到绘图上有一些东西,而不是让曲线从ic开始
我让它们从不同的值开始。。。请看我上面问题的扩展版本。@SergioHaram如果你想知道为什么图不分别从[1 2 3]开始,那只是因为你的sin(t)@Minion是的,这是我关心的,图的初始值。这是一个奇怪的图形行为,但现在你们已经向我澄清了这一点,我没有更多的问题。再次感谢!
tspan = 1:0.02:2;
x= [0.4 0.8 1.2 1.5 2.6];
sizeOftspan = size(tspan);
sizeOfFamily= size(x);
test_mat = zeros(sizeOfFamily(2),sizeOftspan(2));
test_tes= test_ode_45(x(1),tspan);
for i=1:sizeOfFamily(2)
test_mat(i,:)=test_ode_45(x(i),tspan);
end
plot(tspan, test_mat)