Soru sorRunge Kutta ile Durum Denklemi Çözen Fonksiyon Yazmak
rabia tarafından 4 yıl önce soruldu

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

5 Cevap
ekremt Yönetici tarafından 4 yıl önce cevaplandı

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 ?

rabia tarafından 4 yıl önce cevaplandı

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

rabia tarafından 4 yıl önce cevaplandı

Çözmek istediğim  uzay şu şekilde ;
https://hizliresim.com/CVSd9y

ekremt Yönetici tarafından 4 yıl önce cevaplandı

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.

  1. https://matlabgeeks.weebly.com/uploads/8/0/4/8/8048228/runge-kutta-4-order_with_solution.pdf
  2. https://math.okstate.edu/people/yqwang/teaching/math4513_fall11/Notes/rungekutta.pdf
  3. https://www.mathworks.com/matlabcentral/answers/483679-how-to-make-a-function-that-uses-runge-kutta-method
  4. 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
sayginer Yönetici tarafından 4 yıl önce cevaplandı

Merhaba,
Aşağıdaki izletileri takip ederek kodunuzu yazabilirsiniz:

  1. https://www.youtube.com/watch?v=GUREqacu9GE
  2. https://www.youtube.com/watch?v=2zodKoP20WU