I am trying to create a loop to solve a system of differential equations, where x' = -y and y' = x. The initial conditions given are x(0) = r and y(0) = 0, but r can be set as any arbitrary number and it won't change the solution too much. I am getting this error that says "Array indices must be positive integers or logical values", but I am confused because I am nonly trying to set initial conditions. ANY help is greatly appreciated!!!

 Respuesta aceptada

Torsten
Torsten el 28 de Abr. de 2022
Editada: Torsten el 28 de Abr. de 2022

0 votos

Array indices in MATLAB start at 1, not at 0.
Thus you will have to replace
x(0)=1
y(0)=0
by
x(1)=1
y(1)=0
And you solve the wrong equations. What you solve is
x' = -t
y' = y
Look at how you call dxdt and dydt.
In both cases, the call must be
x(n+1) = x(n) + h*dxdt(x(n),y(n))
y(n+1) = y(n) + h*dydt(x(n),y(n))
Further, by the line
t(n+1) = a+n*h
you overwrite the t-vector you've already created by
t=a:h:b
So you should delete this line.

4 comentarios

ISABELLA CORONADO
ISABELLA CORONADO el 28 de Abr. de 2022
Hi, thank you SO much for your response. I actually ended up creating a code that runs, but if you see this and can give me some feedback that would be amazing. The graph doesn't really make sense when I compare it to the solution that I found using the eigenvalue method for my system (x' = -y, y' = x), but I think that's because the forward euler method just isn't a good approximation for this system. I'm just wondering if everything looks correct on the coding end of things, and if not, if this could be the reason that my graph looks nothing like the numerical solution I calculated.
First, I created a function with a loop for the forward euler method, then called it in my live script with a plotting function to visualize my results. I'm wondering, did I plot things correctly? Is my indexing okay? And finally, is there a reason one of my plots is just the constant zero line?
If you see this, thank you so much for your help. You are a great person!!!!!!!
Torsten
Torsten el 28 de Abr. de 2022
Editada: Torsten el 28 de Abr. de 2022
As already noted, you solve
x' = -t
y' = y
instead of
x' = -y
y' = x
The solution to your system is
x(t) = -1/2*t^2 + 1, y(t) = 0.
The solution to the correct system is
x(t) = cos(x), y(t) = sin(x).
The reason is that you did not read my response properly.
ISABELLA CORONADO
ISABELLA CORONADO el 3 de Mayo de 2022
I see. I was confused by your answer involving t, as manually solving the differential equation does not involve t. I ended up using the code attached, and it worked perfectly. I am not familiar enough with matlab to understand if this is equivalent to your suggestion, so I am not sure if what you suggested would have provided the correct results, but I appreciate your help in my process.
Torsten
Torsten el 3 de Mayo de 2022
Editada: Torsten el 3 de Mayo de 2022
As I wrote in my first response, the call to dydt must be
x(n+1) = x(n) + h*dxdt(x(n),y(n))
y(n+1) = y(n) + h*dydt(x(n),y(n))
instead of
x(n+1) = x(n) + h*dxdt(x(n),t(n))
y(n+1) = y(n) + h*dydt(y(n),t(n))
as you first did, and that's what you finally found out by yourself. That's optimal.

Iniciar sesión para comentar.

Más respuestas (1)

KSSV
KSSV el 28 de Abr. de 2022

0 votos

The loop should be taken as:
for i = 1:round(N)
In your present case, it is a fraction and you are getting non integers as the indices and error is pooped.
% Demo
N = 10.2;
for i = 1:N
i
A(i) = rand ; % error, index cannot be fraction
end

Categorías

Más información sobre Mathematics en Centro de ayuda y File Exchange.

Productos

Versión

R2022a

Preguntada:

el 28 de Abr. de 2022

Editada:

el 3 de Mayo de 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by