Runge kutta çözüm fonksiyonu ile bir durum uzayı çözmeye çalışıyorum. Durum uzayındaki matrisleri 2×2 şeklinde.
function [T,X] = rungekutta(t,x,t1,n,f)
T=t;
X=x';
h=(t1-t)/n;
for i=1:n;
k1 = f(t,x);
k2 = f(t+h/2,x+k1*h/2);
k3 = f(t+h/2,x+k2*h/2);
k4 = f(t+h,x+k3*h);
x=x+h*(k1+2*k2+2*k3+k4)/6;
t=t+h;
T=[T;t];
X=[X;x'];
end
Yazdığım fonksiyon çalışmıyor ve hata veriyor. Yazmaya çalıştığım 4 adımlı algortima şu şekilde:
https://hizliresim.com/9AfKYv
Merhaba,
Sizin buradaki başlangıç değerleriniz mevcut mu ? Fonksiyon olduğu için başka bir kod parçasından fonksiyona değer atıyor ama deneme için örnek değerler paylaşır mısınız ?
Benim yapmak istediğim durum uzayı bu değil tam olarak ama denemek için 2×1'lik olarak bunu oluşturdum fakat çalışmadı bu da ;
%***************************************
% Data and initial conditions
A=[ -3 1
-2 0];
B=[ 0 1];
C=[ 1 0];
D=0;
% initials for simulation
x10=0;
x20=0;
tend=5;
% k is dimension counter.
%****************************************
%u=[u1 u2];
u1=0;
u2=1;
dt=0.01;
t0=0;
k=1;
% Runge Kutta Algorithm
while t0<tend
x11=x10;
x21=x20;
a1=dt*( A(1,1)*x11 + A(1,2)*x21 + B(1,1)*u(1)+B(1,2)*u(2));
a2=dt*( A(2,1)*x11 + A(2,2)*x21 + B(2,1)*u(1)+B(2,2)*u(2)); x12=x10+a1/2; x22=x20+a2/2;
b1=dt*( A(1,1)*x12 + A(1,2)*x22 + B(1,1)*u(1)+B(1,2)*u(2));
b2=dt*( A(2,1)*x12 + A(2,2)*x22 + B(2,1)*u(1)+B(2,2)*u(2)); x13=x10+b1/2; x23=x20+b2/2;
c1=dt*( A(1,1)*x13 + A(1,2)*x23 + B(1,1)*u(1)+B(1,2)*u(2));
c2=d*( A(2,1)*x13 + A(2,2)*x23 + B(2,1)*u(1)+B(2,2)*u(2)); x14=x10+c1; x24=x20+c2;
d1=dt*( A(1,1)*x14 + A(1,2)*x24 + B(1,1)*u(1)+B(1,2)*u(2));
d2=dt*( A(2,1)*x14 + A(2,2)*x24 + B(2,1)*u(1)+B(2,2)*u(2));
x1(k)=x10+(a1+2*b1+2*c1+d1)/6;
x2(k)=x20+(a2+2*b2+2*c2+d2)/6;
U(k)=u1;
t(k)=t0+dt;
t0=t(k); x10=x1(k);
x20=x2(k);
k=k+1;
end;
% Plotting the results
subplot(211)
plot(t,x1);
title('x1');
xlabel('time in seconds'):ylabel('x1');
grid subplot(212) plot(t,x2);
title('x2');
xlabel('time in seconds'):ylabel('x2');
grid
Ben sizin belirttiğiniz ilk duruma göre yaptığım araştırmada sorunuzun ilk kısmındaki fonksiyonu çalıştırdım.
Bunun kod parçasını ve ilgili internet adreslerini paylaşıyorum. Bir inceleyin, kodunuza entegre etmeye çalışın, olmaz ise tekrar sorunuzu iletin.
- https://matlabgeeks.weebly.com/uploads/8/0/4/8/8048228/runge-kutta-4-order_with_solution.pdf
- https://math.okstate.edu/people/yqwang/teaching/math4513_fall11/Notes/rungekutta.pdf
- https://www.mathworks.com/matlabcentral/answers/483679-how-to-make-a-function-that-uses-runge-kutta-method
- https://www.mathworks.com/matlabcentral/answers/434525-how-to-create-runge-kutta-4th-order-routine-to-solve-first-order-ode-s
Çalıştırdığım Kod Parçası:
%% 04_06_20 Runge Kutta clc; % Clears the screen clear all; h=1.5; % step size x = 0:h:3; % Calculates upto y(3) y = zeros(1,length(x)); y(1) = 5; % initial condition F_xy = @(t,r) 3.*exp(-t)-0.4*r; % change the function as you desire for i=1:(length(x)-1) % calculation loop k_1 = F_xy(x(i),y(i)); k_2 = F_xy(x(i)+0.5*h, y(i)+0.5*h*k_1); k_3 = F_xy((x(i)+0.5*h), (y(i)+0.5*h*k_2)); k_4 = F_xy((x(i)+h), (y(i)+k_3*h)); y(i+1) = y(i) + (1/6)*(k_1+2*(k_2+k_3)+k_4); % main equation end
Merhaba,
Aşağıdaki izletileri takip ederek kodunuzu yazabilirsiniz: