Решение и построение уравнения для различных постоянных значений - PullRequest
2 голосов
/ 11 июля 2019

Я решил это дифференциальное уравнение (theta '' (x) + (2 / x) theta '(x) + theta ^ n = 0), используя odeint.

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt

#value of constants
n = 1.0

#define function
def exam(y, x):
    theta, omega = y
    dydx = [omega, - (2.0/x)*omega - theta**n]
    return dydx


#initial conditions
y0 = [1.0, 0.0] ## theta, omega

x = np.linspace(0.1, 10, 100)

#call integrator
sol = odeint(exam, y0, x)

plt.plot(x, sol[:, 0], 'b', label='For n = 1')
plt.legend(loc='best')
plt.grid()
#plt.show()


###### (same procedure for n = 2) #########

#value of constants
n = 2.0
#define function
def exam(y, x):
    theta, omega = y
    dydx = [omega, - (2.0/x)*omega - theta**n]
    return dydx

#initial conditions
y0 = [1.0, 0.0] ## theta, omega

x = np.linspace(0.1, 10, 100)

#call integrator
sol = odeint(exam, y0, x)

plt.plot(x, sol[:, 0], 'g', label='For n = 2')
plt.legend(loc='best')
plt.grid()
plt.show()

Хотя естьнет проблем, и я получил ожидаемый результат.Я просто хочу знать, существует ли какая-либо процедура (например, цикл или что-то еще), с помощью которой я могу избежать этой повторяющейся процедуры и могу решить уравнение для различных значений постоянной n за один раз?

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Один из способов добиться того, что вы ищете, - это обернуть ваш код в функцию, в которой вы укажете n.Затем используйте цикл for, чтобы выполнить итерацию по списку указанных n, а затем, после завершения цикла, получите свою цифру.

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint


def solveit(n=1):

    def exam(y, x):
        theta, omega = y
        dydx = [omega, - (2.0/x)*omega - theta**n]
        return dydx

    #initial conditions
    y0 = [1.0, 0.0] ## theta, omega
    x = np.linspace(0.1, 10, 100)

    #call integrator
    sol = odeint(exam, y0, x)

    plt.plot(x, sol[:, 0], label='For n = %s'%n) #plot the curve and label n



#List of n to loop through        
ns= [1.,2.,3.,4.,5.]

fig = plt.figure() #declare fig

for n_ in ns:
    solveit(n_) #the function will plot curve for specified n

plt.legend(loc='best') #after loop add the legend and plot characteristics
plt.grid()
plt.show()

enter image description here

0 голосов
/ 11 июля 2019

Создайте список со всеми значениями n, которые вы хотите проверить, затем вызовите вашу функцию для каждого значения

...