2017-01-13 28 views
1

我寫關於解決在使用拍攝二分法下邊界值問題的程序:MATLAB情節載體必須是相同的長度

y''-y+x=0, y(0)=y(1)=0. 

我第一次將它轉換爲一階微分方程的系統,設置

y'=z 

然後我讓dydt代表矢量(Y 'Z'),並拿出腳本文件:

function dydt=shoot(t,y) 
dydt=[y(2);y(1)-t] 
end 

有了這個,然後我想出了下面的代碼:

clear 
clc 
a=0; 
b=1; 
alpha=0; 
beta=0; 
s(1)=(beta-alpha)/(b-a); 
s(2)=-1 
[G,Y]=ode113('shoot',[a b],[alpha;s(1)]); 
[G,Z]=ode113('shoot',[a b],[alpha;s(2)]) 
hold 
tol=1e-4 
u=s(1); 
v=s(2); 
while abs(u-v)>tol; 
s(3)=(u+v)/2; 
[G,W]=ode113('shoot',[a b],[alpha;s(3)]); 
if W(end,1)>0 
    u=s(3); 
else 
    v=s(3); 
end 
end 

[G,W]=ode113('shoot',[a b],[alpha;s(3)]) 

plot(G,Y(:,1),'-o', G,Z(:,1),'-o',G,W(:,1),'-o') 

然後我運行程序,MATLAB說我使用的是情節的說法不正確,在情節的載體必須是相同的長度。我不知道如何解決這個問題。任何幫助表示讚賞。

+1

'G'的大小和'Y(:,1)'的大小是多少?他們需要是相同的大小。 – Suever

+0

如果您要使用割線方法(或包含方括號的變體的regula falsi方法),則您的迭代將在一個步驟中終止。問題是線性的,因此第二個邊界值與第一個邊界值線性相關,並且線性函數可以由兩個點確定。 – LutzL

+0

@LutzL我認爲我在兩次槍擊後使用了二分法。你的意思是我的循環在這種情況下一步之後終止? –

回答

2

您的Y,ZW輸出來自ode113的不同運行。來自每次運行的輸出獨立變量G是不同的,因爲ode113是自適應求解器。有兩種方法可以解決這個問題。您可以將G輸出保存爲獨立的變量:

... 
[Gy,Y]=ode113('shoot',[a b],[alpha;s(1)]); 
[Gz,Z]=ode113('shoot',[a b],[alpha;s(2)]); 
... 
[Gw,W]=ode113('shoot',[a b],[alpha;s(3)]); 
plot(Gy,Y(:,1),'-o', Gz,Z(:,1),'-o',Gw,W(:,1),'-o'); 

或者你可以指定一組固定的輸出點by specifying more than two points for tspan的(第二個參數ode113):

... 
tspan = linspace(a,b,50); 
[G,Y]=ode113('shoot',tspan,[alpha;s(1)]); 
[G,Z]=ode113('shoot',tspan,[alpha;s(2)]); 
... 
[G,W]=ode113('shoot',tspan,[alpha;s(3)]); 
plot(G,Y(:,1),'-o', G,Z(:,1),'-o',G,W(:,1),'-o'); 

除非您的MATLAB的版本超過10歲,您還應該指定您的集成功能,shoot,通過function handle,而不是一個字符串,即:

[Gw,W]=ode113(@shoot,[a b],[alpha;s(3)]); 
+0

這工作得很好。謝謝! –

相關問題