2014-05-14 243 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

中的位置非常感謝! –