Je suis totalement novice en python et, en fait, tout langage de programmation fondamental, j'utilise Mathematica pour mes calculs symboliques et numériques. J'apprends à travailler avec Python et à le trouver vraiment génial! Voici un problème que j'essaie de résoudre mais coincé sans idée! J'ai un fichier de données par exempledéfinition d'une fuction à utiliser pour résoudre l'équation à partir d'un fichier de données
0. 1.
0.01 0.9998000066665778
0.02 0.9992001066609779
... ..
qui vient le {t, Cos [2t]}. Je veux définir une fonction à partir de ces données et l'utiliser pour résoudre une équation en python. Mon intuition Mathematica me dit que je dois définir la fonction comme:
iFunc[x_] = Interpolation[iData, x]
et le reste du travail est facile. par exemple
NDSolve[{y''[x] + iFunc[x] y[x] == 0, y[0] == 1, y[1] == 0}, y, {x, 0, 1}]
Résout l'équation facilement. (Je n'ai pas essayé avec des cas plus compliqués cependant). Maintenant, comment faire le travail en python et aussi la précision est un problème important pour moi. Donc, maintenant je voudrais poser deux questions.
1. Est-ce la méthode la plus précise dans Mathematica?
2. Et quel est l'équivalent d'une façon plus précise de faire le problème en python?
Voici mon humble tentative de résoudre le problème (avec beaucoup d'entrée de StackOverflow) où la définition avec cos (2t) fonctionne:
from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
from math import cos
from scipy import interpolate
data = np.genfromtxt('cos2t.dat')
T = data[:,0] #first column
phi = data[:,1] #second column
f = interpolate.interp1d(T, phi)
tmin = 0.0# There should be a better way to define from the data
dt = 0.01
tmax = 2*np.pi
t = np.arange(tmin, tmax, dt)
phinew = f(t) # use interpolation function returned by `interp1d`
"""
def fun(z, t):
x, y = z
return np.array([y, -(cos(2*t))*x ])
"""
def fun(z, t):
x, y = z
return np.array([y, -(phinew(t))*x ])
sol1 = odeint(fun, [1, 0], t)[..., 0]
# for checking the plots
plt.plot(t, sol1, label='sol')
plt.show()
* Quand je lance le code avec fonction interpolée à partir des données cos (2t), ne fonctionne pas ... le message d'erreur dit
Traceback (most recent call last): File "testde.py", line 30,
in <module> sol1 = odeint(fun, [1, 0], t)[..., 0]
File "/home/archimedes/anaconda3/lib/python3.6/site-packages/scipy/integrate/odepack.py",
line 215, in odeint ixpr, mxstep, mxhnil, mxordn, mxords)
File "testde.py",
line 28, in fun return np.array([y, -(phinew(t))*x ])
TypeError: 'numpy.ndarray' object is not callable.
Je ne peux vraiment pas les déchiffrer. S'il vous plaît aider ...
Quel est exactement votre problème? – Wrzlprmft
Le code avec interpolation ne fonctionne pas ... le message d'erreur tell Traceback (dernier appel en dernier): Fichier "testde.py ", ligne 30, dans sol1 = odeint (fun, [1, 0], t) [..., 0] Fichier" /home/archimedes/anaconda3/lib/python3.6/site-packages/ scipy/integrate/odepack.py ", ligne 215, dans odeint ixpr, mxstep, mxhnil, mxordn, mxords) Fichier" testde.py ", ligne 28, dans le plaisir return np.array ([y, - (phinew (t)) * x]) TypeError: l'objet 'numpy.ndarray' n'est pas appelable Je ne peux vraiment pas les déchiffrer –
Archimedes
Veuillez ajouter des informations supplémentaires à votre question, vous avez également une meilleure mise en forme. pour le message d'erreur, n'hésitez pas à modifier votre texte autour de lui – LutzL