2017-01-13 12 views
1

Я пишу программу относительно решения следующей краевой задачи, используя метод съемки половинного деления:MATLAB сюжетных векторы должны быть одни и те же длинами

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

Я первый преобразовать это к системе уравнений первого порядка, набор

y'=z 

я пусть dydt представим вектор (у 'г'), и придумать с файлом сценария:

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

Ваша итерация закончилась бы за один шаг, если бы вы использовали секущий метод (или метод регуляции регуляции для варианта в квадратных скобках). Задача линейна, поэтому второе граничное значение линейно зависит от первого, а линейная функция может быть определена двумя точками. – LutzL

+0

@LutzL. Я думаю, что я использую метод деления пополам после двух съемок. Вы имеете в виду, что моя петля заканчивается после одного шага в этом случае? –

ответ

2

Ваши Y, Z и W выходы рассчитаны от разных серий 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

Это работает очень хорошо. Благодаря! –