2013-06-14 15 views
7

Tôi đang cố gắng sử dụng ode45 để giải quyết một hệ thống của ODE:Matlab: Có thể giải toán số một hệ thống ode bằng một hỗn hợp các điều kiện ban đầu và thiết bị đầu cuối không?

[X,Y]= ode45(@sys,[0, T],y0); 

nơi,

function dy = sys(t,y) 

     dy(1) = f_1(y) 
     dy(2) = f_2(y) 
     dy(3) = f_3(y) 
end 

Vấn đề là các chức năng ode45 đòi hỏi y0 được giá trị ban đầu [y_1(0), y_2(0), y_3(0)], trong khi ở tôi hệ thống, tôi chỉ có các giá trị [y_2(0), y_3(0), y_3(T)] có sẵn.

Về mặt toán học, tập hợp điều kiện ban đầu/thiết bị đầu cuối này đủ để ghim hệ thống, nhưng có cách nào tôi có thể làm việc với điều đó bằng ode45 hoặc bất kỳ chức năng nào khác trong MATLAB không?

Cảm ơn!

+0

Tôi thực sự quan tâm đến câu hỏi này, nhưng tôi sợ rằng tôi không thể giúp; Tôi không bao giờ gặp phải vấn đề này trước đây ... Tôi biết rằng 'ode45' có thể tích hợp ngược lại (chỉ sử dụng' tspan = [tend tstart] '), vì vậy bạn có thể pha trộn một lược đồ lặp lại để có' y_1' sao cho 'y_3 (0) 'và' y_3 (T) 'được thỏa mãn. Không cần phải nói, điều này có thể sẽ là * rất * chậm và khá vụng về, nhưng nó sẽ là một ** giải pháp **. Tôi sẽ giữ một mắt trên này :) Bạn có thể đăng các phương trình và điều kiện ban đầu/thiết bị đầu cuối? –

+0

@RodyOldenhuis Tôi nghĩ rằng tôi đã tìm ra cách để giải quyết vấn đề này. – Vokram

Trả lời

6

Sau khi đào trong tài liệu Matlab một chút, tôi nghĩ cách thanh lịch hơn là sử dụng chức năng bvp4c. bvp4c là một chức năng được thiết kế đặc biệt để xử lý các vấn đề về giá trị biên như thế này, trái ngược với ode**, thực sự chỉ dành cho các vấn đề giá trị ban đầu. Trong thực tế, có một tập hợp toàn bộ các chức năng khác như devalbvpinit trong Matlab thực sự tạo thuận lợi cho việc sử dụng bvp4c. Đây là link to the Matlab documentation.

tôi sẽ đăng một ví dụ ở đây ngắn gọn (có lẽ một chút giả tạo và):

function [y1, y2, y3] = test(start,T) 

solinit = bvpinit(linspace(0,3,10), [1,1,0]); 
sol = bvp4c(@odefun,@bvpbc,solinit); 

tspan = linspace(start,T,100); 
S = deval(sol, tspan); 
y1 = S(1,:); 
y2 = S(2,:); 
y3 = S(3,:); 

plot (tspan,y1) 

figure 
plot (tspan,y2) 

figure 
plot (tspan,y3) 


%% system definition & BVCs 

function dydx = odefun(t,y) 
    dydx(1) = y(1) + y(2) + t; 

    dydx(2) = 2*y(1) + y(2); 

    dydx(3) = 3 * y(1) - y(2); 
end 

function res = bvpbc(y0,yT) 
    res= [y0(3) yT(2) yT(3)]; 
end 

end 

Các test đầu ra chức năng 3 vectơ các giải pháp điểm cho y1, y2y3 tương ứng, và cũng âm mưu chúng.

Dưới đây là những con đường biến vẽ bằng Matlab: y1 path y2 path y3 path

Ngoài ra, tôi tìm thấy this video by professor Jake Blanchard từ WMU là rất hữu ích.

+0

+2: chắc chắn có vẻ như bạn đã liếm nó! Tôi đã học được điều gì đó mới mẻ hôm nay, cảm ơn vì điều đó :) –

+0

+2 vì đã ngạc nhiên rằng @RodyOldenhuis không biết về người giải quyết BVP! :-) Bạn có thể chấp nhận câu trả lời của riêng bạn nếu bạn muốn. – horchler

3

Một cách tiếp cận là sử dụng shooting method để lặp lại giải quyết cho trạng thái ban đầu chưa biết y_1(0) sao cho trạng thái cuối cùng mong muốn y_3(T) được thỏa mãn.

Số tiền thu được lặp đi lặp lại bằng cách giải một phương trình phi tuyến F = 0:

F(y_1(0)) = Y_3(T) - y_3(T) 

nơi hàm chữ hoa Y sự là giải pháp thu được bằng cách tích hợp của ODE mong trong thời gian từ một tập hợp các điều kiện ban đầu. Nhiệm vụ là để đoán giá trị của y_1(0) để có được F = 0.

Vì bây giờ chúng ta đang giải phương trình phi tuyến, tất cả các phương pháp thông thường đều được áp dụng. Cụ thể là bạn có thể sử dụng phương pháp bisection hoặc Newton để cập nhật phỏng đoán của bạn cho trạng thái ban đầu chưa biết y_1(0). Lưu ý một vài điều:

  1. ODE được tích hợp trên [0,T] tại mỗi lần lặp của giải pháp phi tuyến.
  2. Có thể có nhiều giải pháp cho F = 0, tùy thuộc vào cấu trúc của ODE của bạn.
  3. Phương pháp của Newton có thể hội tụ nhanh hơn chia đôi, nhưng cũng có thể không ổn định về số lượng trừ khi bạn có thể đưa ra dự đoán bắt đầu tốt cho y_1(0).

Sử dụng các hàm MATLAB hiện có, bộ giải mã phi tuyến giới hạn FMINBND có thể là một lựa chọn tốt làm bộ giải phi tuyến.

Hy vọng điều này sẽ hữu ích.

+0

+1: đây có thể là cách tiếp cận của tôi, nhưng tôi nghĩ câu trả lời của chính Vokram phải được bình chọn ở đầu :) –

Các vấn đề liên quan