Vinnaren i pepparkakshustävlingen!
2010-09-24, 00:08
  #1
Medlem
Tja! jag försöker lösa diffekvationen

y' = -xy

mha. RK2 i matlab. Det går inte riktigt som jag vill. Detta är min kod:

Kod:
clear all

x(1)=0;
y(1)=1;

%[a,b] is the interval at which we are looking
a = 0;
b = 1;
h = 0.01;

%N is the total number of steps in our interval, and h is the step size

N = (b-a)/h;


%2nd order RK, with coefficient values assigned according Heun's method:

for n=1:(N-1);

    k1 = -x(n)*y(n)*h;
    k2 = -(x(n)+h)*(y(n)+h);
    y(n+1) = y(n) + (1/2*k1 + 1/2*k2)*h;
    
end

plot(x,y,x,exp(-x.^2./2).*1);

Felet jag får är:

Kod:
??? Attempted to access x(2); index out of bounds because numel(x)=1.

Error in ==> E12 at 21
    k1 = -x(n)*y(n)*h;

Kan någon reda ut begreppen? numel(x) ska tydligen ha att göra med antalet element i x?

Tack!
Citera
2010-09-24, 00:11
  #2
Medlem
Den klagar alltså för att du i andra iterationen av din loop försöker läsa av värdet på x(2), som du inte har satt än.

Lösningen är väl helt enkelt att du sätter x(n+1) till det det ska bli (dvs x(n) + h) i loopen.

Notera dock att det är mycket bättre att allokera minne för x och y i förväg, istället för att låta de automatiskt växa ett steg i varje loop-iteration; detta görs väl bäst medelst

Kod:
x = zeros(1,N);
y = zeros(1,N);
Citera
2010-09-24, 00:24
  #3
Medlem
dbshw till räddningen ännu en gång!
Citera
2010-09-24, 01:12
  #4
Medlem
Nu funkar programmet, men om jag har med din minnesallokering så funkar inte plotten i slutet. Några ideer?
Citera
2010-09-24, 12:42
  #5
Medlem
Hmm, posta hela koden?
Citera
2010-09-24, 16:57
  #6
Medlem
Sure. Den ser ut såhär:

Kod:
clear all
close all

x(1)=0;
y(1)=1;

%[a,b] is the interval at which we are looking
a = 0;
b = 1;

%N is the total number of steps in our interval, and h is the step size
h = input('Step size h=')
%h = 0.001;
N = 1/h;

%memory is allocated -- THIS DOESN'T WORK, DON'T KNOW WHY 
%x = zeros(1,N);
%y = zeros(1,N);

%2nd order RK, with coefficient values assigned according Heun's method:

for n=1:(N-1);

    x(n+1) = x(n) + h;
    k1 = -x(n)*y(n);
    k2 = -(x(n)+h)*(y(n)+h);
    y(n+1) = y(n) + (1/2*k1 + 1/2*k2)*h;
    
end

%the result is plotted, along with the exact solution for comparison

plot(x,y,'r')
hold on
plot(x,exp(-x.^2./2),'b')

Om jag tar bort utkommenteringen av de två raderna så plottar den inte samma sak längre.
Citera
2010-09-24, 16:59
  #7
Medlem
Aha. Men du ska ju allokera minnet innan du sätter x(1) och y(1). Annars så skrivs ju bara y(1) över till 0. Dvs flytta de två 'zeros'-raderna till ovanför x(1) = 0.
Citera
2010-09-24, 17:07
  #8
Medlem
Ah, alright, då är jag med. Nu funkar det. Tack igen!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback