Python Forum

Full Version: Need Help solving second order differential equations
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
So I have been working on a code to solve a coupled system of second order differential equations, in order to obtain the numerical solution of an elastic-pendulum. I've written the code needed to get the results and plot them, but I keep getting the following error: "TypeError: <lambda>() missing 1 required positional argument: 'd'". I really appreciate any help. Here's the code:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import math

ci = [0.01, 0., 0., 0.0156613949, 0.00237, 0.]


def solver(t, pinit):
    return odeint(lambda a,b,d : [a[1], -4*math.pi*math.pi*a[0]*(math.sqrt(a[0]*a[0]+b[0]*b[0]+d[0]*d[0])- 3/4)/math.sqrt(a[0]*a[0]+b[0]*b[0]+d[0]*d[0]),b[1], -4*math.pi*math.pi*b[0]*((a[0]**(2)+b[0]**(2)+d[0]**(2))**(1/2) - 3/4)/(a[0]**(2)+b[0]**(2)+d[0]**(2))**(1/2), d[1],-4*math.pi*math.pi*d[0]*(math.sqrt(a[0]**(2)+b[0]**(2)+d[0]**(2)) - 3/4)/math.sqrt(a[0]**(2)+b[0]**(2)+d[0]**(2)) - math.pi*math.pi], pinit, t)


time = np.arange(0, 500.0, 0.01)
solution = solver(time, ci)
plt.plot(solution[:,0], solution[:,2])
plt.show()
I think the first argument of odeint() is a function that computes the first derivative of the state vector at time t, so it's probably something along the line of
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
 
ci = [0.01, 0., 0., 0.0156613949, 0.00237, 0.]

def func(c, t):
    a, A, b, B, d, D = c
    #a, b, d, A, B, D = c # Correct order of arguments?
    p2 = np.pi ** 2
    n = np.linalg.norm([a, b, d])
    q = (n - 3 / 4) / n
    res = [A, -4 * p2 * q * a, B, -4 * p2 * q * b, D, -4 * p2 * q * d - p2]
    return res
    
 
def solver(t, pinit):
    return odeint(func, pinit, t)
 
 
time = np.arange(0, 500.0, 0.01)
solution = solver(time, ci)
plt.plot(solution[:,0], solution[:,2])
plt.show()
Here I assumed that the state vector had the six coordinates a, b, d, and their derivatives which I called A, B, D. I may be wrong in the order of these parameters, so please explain the correct order of the variables.

Don't use lambda functions if the expression is too long. It makes code difficult to read.
Yes, the vector you assumed was the correct one, and thanks for this information regarding the usage (or lack thereof) of lambda functions. It is properly working now and giving the results it should be giving. Thank you a lot!