2

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/scip‌​y/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 ...

+0

Quel est exactement votre problème? – Wrzlprmft

+0

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

+0

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

Répondre

0

Pour sous-question 2

Avec

t = np.arange(tmin, tmax, dt) 

phinew = f(t) # use interpolation function returned by `interp1d` 

équivalent à

phinew = np.array([ f(s) for s in t]) 

vous construisez phinew pas en fonction appelable mais en tant que tableau de valeurs, fermant le tableau de cercle à la fonction d'interpolation au tableau. Utilisation f qui est une fonction scalaire directement dans la fonction des produits dérivés,

def fun(z, t): 
    x, y = z 
    return np.array([y, -f(t)*x ])  
+0

J'ai modifié le code comme vous l'avez suggéré maintenant l'erreur suivante montre Fil e "testde.py", ligne 39, en sol1 = odeint (fun, [1, 0], t) [..., 0] Fichier "/usr/lib/python2.7/dist-packages/ scipy/integrate/odepack.py ", ligne 215, dans odeint ixpr, mxstep, mxhnil, mxordn, mxords) Fichier" testde.py ", ligne 37, dans le fun return np.array ([y, -f (t) * x]) Fichier "/usr/lib/python2.7/dist-packages/scipy/interpolate/polyint.py", ligne 80, dans __call__ y = self._evaluate (x) – Archimedes

+0

Fichier "/ usr /lib/python2.7/dist-packages/scipy/interpolate/interpolate.py ", ligne 586, dans _evaluate below_bounds, above_bounds = self._check_bounds (x_new) Fichier" /usr/lib/python2.7/dist- packages/scipy/interpolate/interpolate.py ", ligne 618, dans _check_bounds raise ValueError ("Une valeur dans x_new est au-dessus de l'interpolation" ValueError: Une valeur dans x_new est au-dessus de la plage d'interpolation. – Archimedes

+0

Cela arrive parce que odeint resp. Isoda utilise des tailles de pas adaptatives et les étapes internes peuvent quitter les limites de l'intervalle d'intégration. Rend l'intervalle de points d'échantillonnage pour 'cos2t.dat' plus grand (ou l'intervalle d'intégration plus petit de la même quantité), même un point comme dans le' T = np.arange simulé (tmin, tmax + dt, dt); phi = np.cos (2 * T) ', et cela fonctionne sans erreur. – LutzL

1

Dans Mathematica, de la manière habituelle est simplement

iFunc = Interpolation[iData] 

Interpolation[iData] renvoie déjà une fonction.

+0

Un moyen d'avoir une vérification de l'exactitude? Je ne peux penser qu'à tracer les données avec une courbe d'interpolation. – Archimedes

+0

Je ne comprends pas ce que cela signifie "vérifier la précision". L'interpolation passera par tous vos points de données. Peut-être que vous voulez l'ajustement au lieu de l'interpolation? – Szabolcs

+0

Ce que je voulais dire, c'est que le "moyen habituel" est aussi le meilleur moyen de Mathematica? J'ai essayé de regarder la documentation de Wolfram et cela décrit à peu près tout. Mais pour moi, cela semble une solution trop simple pour un problème compliqué ou peut-être que c'est comme ça que Mathematica est! – Archimedes