2014-05-14 195 views
0

我想知道是否有可能结合for-loops/while-loops and ODE45,请看下面的例子:我想在不同的ic解决结合for循环/ while循环和ODE45

我有一个函数(ODE) (初始条件):

ser = @(x) x.^(-0.3) - x.^(1.8); % the function 
tspan = 1:0.02:2; 
x0 = 0.5; 
% x0 = 0.8; 
% x0 = 1.2; 
% x0 = 1.8; 
% x0 = 2; 
% x0 = 2.5; 
[~, x_t] = ode45(@(t,x) ser(x), tspan, x0); 
plot(tspan,x_t,'r-') 

并在最后标出solution curves

有没有办法通过其他ic而不手动,如循环?或以任何其他方式来优化这一步?如果我能得到一些帮助,这将非常感激,因为我必须在15到25个不同的ic上计算许多ODEs(更复杂的)。

在此先感谢!

PS。如果代码必须更改(例如x0或解决方案x_t的不同名称),则代码将会OK!

+0

我说得对,你想绘制一个函数族f_x(t)。你的家庭参数x在数组中给出?如果是这样,您可以将数据传输到矩阵。 –

+0

嗨@Minion,绘图部分实际上并不重要。你能否多说一点,如何将_transfer__values_转换为矩阵?或如何看待? –

+0

我正在考虑一个矩阵,你给出的例子代码将有6行51列。每一行代表上面给出的x0值之一和代表tspan的列。然后你可以绘制(tspan,Matrix) –

回答

1

如果你有一个预定义的号码。的ic,你可以用这个循环:

for i=1:NoOfic 
     test_mat(i,:)=test_ode_45(x(i),tspan); 
    end 

你应该有足够的尺寸如要预定义矩阵(test_mat)

test_mat = zeros(NoOfic, SizeOftspan) 

很显然,我已经定义的变量NoOficSizeOftspan具体数字

我的整个测试代码:

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 *罪(T )函数

+0

甜!感谢@Minion的视觉例子,我现在明白了!而且,'test_mat'中的每个'row'对应一个'time-series'''解决方案'对吗?或将它是每个“列”? –

+0

这取决于您的实施。如果你这样做,每一行代表一个时间序列(51个元素)。但您可以轻松更改代码来转置它。只记得改变'test_mat'的定义以及循环索引在矩阵 –

+0

中的位置非常感谢! –