Help with Octave for system of ODEs

AI Thread Summary
The discussion revolves around solving a system of ordinary differential equations (ODEs) using Octave, with specific focus on issues related to plotting results. The user is struggling with the appropriate selection of time intervals in the `linspace()` function, which affects convergence and output. They also face challenges in correctly plotting the results, as attempts to visualize the solutions yield blank graphs or unexpected outputs. The conversation highlights the need for clarity on the output format of the `lsode` function and how to properly extract and plot the results. Overall, the user seeks guidance on both the numerical solving process and effective visualization of the solutions.
McLaren Rulez
Messages
289
Reaction score
3
Hi,

I am having a lot of trouble with Octave as I try to solve a system of ODEs. Any help is appreciated, I am a complete newbie with Octave and numerical solving.

Let's try a very simple one. Suppose I had a pair of ODEs with a and b being functions of time

\frac{da}{dt}=2ba
\frac{db}{dt}=1
Initial conditions are a(0)=1, b(0)=0

This is clearly the solved by a(t)=e^{t^{2}} b(t)=t My Octave code was this:

function xdot=f(x,t);
xdot=zeros(2,1)
xdot(1)=2*x(1)*x(2)
xdot(2)=1
endfunction

t=linspace(0,10,100);
x=lsode("f",[1;0],t)

I want to plot a(t) against t or b(t) or some combination of a and b against t. Here are my issues

1) The t=linspace() part. What numbers are appropriate? Sometimes, I got an error saying convergence failure but this combinations worked through blind luck. In general, what should I choose and why does it seem to matter? As I understand, this tells Octave to take t from 0 to 10 and have 100 intervals. I thought any numbers there would have worked?

2) This is more important. I tried plot(t,x(1)) but I got a blank plot. plot(t,x(2)) also gave me a blank plot. plot(t,x) gave me something but it's really weird. Isn't x now a column vector? I'm not sure what exactly lsode outputs here. What should be the correct command to get a(t) against t, which must of course be an exponential t squared against t graph?

There's also the fact that when I do it for my actual set of ODEs which are slightly more complicated, it inevitably hits an error or gets something 'x' undefined at a certain column and certain line. I'm quite lost :(

Thank you for you help.
 
Last edited:
Physics news on Phys.org
Well...don't know ODEs nor Octave, but a quick look at python's scipy revealed a similar function.

Code:
import numpy as np
from scipy.integrate import odeint

import matplotlib.pyplot as plt

def dxdt(x,t):
    xdot = np.zeros(2)
    xdot[0] = 2.0*x[0]*x[1]
    xdot[1] = 1.0
    return xdot
    
t = np.linspace(0,5,51)
x = odeint(dxdt, [1.0,0.0], t)

fig = plt.figure()

ax1 = fig.add_subplot(211)
ax1.plot(t,x[:,0])
ax1.set_ylabel('a(t)')

ax2 = fig.add_subplot(212)
ax2.plot(t,x[:,1])
ax2.set_xlabel('t')
ax2.set_ylabel('b(t)')

plt.show()

See attached plot, too.
 

Attachments

  • ab-ode.png
    ab-ode.png
    6.6 KB · Views: 608

Similar threads

Replies
6
Views
3K
Replies
4
Views
2K
Replies
1
Views
2K
Replies
5
Views
2K
Replies
1
Views
2K
Replies
1
Views
2K
Back
Top