Help with Octave for system of ODEs

Click For Summary
SUMMARY

This discussion focuses on solving a system of ordinary differential equations (ODEs) using GNU Octave. The user provided a specific example with initial conditions and shared their Octave code, which utilizes the lsode function for numerical integration. Key issues raised include the appropriate selection of time intervals in linspace and difficulties in plotting the results correctly. The conversation also references a similar implementation in Python using the scipy.integrate.odeint function, highlighting cross-tool comparisons.

PREREQUISITES
  • Familiarity with ordinary differential equations (ODEs)
  • Basic understanding of GNU Octave syntax and functions
  • Knowledge of numerical methods for solving ODEs
  • Experience with data visualization in Octave or similar tools
NEXT STEPS
  • Research GNU Octave's linspace function and its impact on numerical stability
  • Explore the lsode function in GNU Octave for solving ODEs
  • Learn about plotting techniques in Octave to visualize ODE solutions
  • Investigate Python's scipy.integrate.odeint for ODE solving and compare with Octave
USEFUL FOR

This discussion is beneficial for students and professionals working with numerical methods, particularly those using GNU Octave for solving ODEs, as well as developers transitioning from Octave to Python for similar tasks.

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: 650

Similar threads

  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 7 ·
Replies
7
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 1 ·
Replies
1
Views
3K
Replies
3
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K