定义用于从数据文件求解方程的函数

defining a fuction to be used in solving equation from a data file

我对 python 完全陌生,事实上任何基础编程语言,我都使用 Mathematica 进行我所有的符号和数字计算。我正在学习使用 python 并发现它真的很棒!这是一个我试图解决但毫无头绪的问题! 例如我有一个数据文件

0.      1.    
0.01    0.9998000066665778    
0.02    0.9992001066609779    
...     ..
 

这就是{t, Cos[2t]}。 我想根据这些数据定义一个函数,并用它来求解 python 中的方程。我的 Mathematica 直觉告诉我应该像这样定义函数:

    iFunc[x_] = Interpolation[iData, x]

剩下的工作就很简单了。例如

NDSolve[{y''[x] + iFunc[x] y[x] == 0, y[0] == 1, y[1] == 0}, y, {x, 0, 1}]
    

轻松解方程。 (虽然我没有尝试过更复杂的案例)。 现在如何在 python 中完成工作以及准确性对我来说是一个重要的问题。那么,现在我想问两个问题。

1.这是 Mathematica 中最准确的方法吗?

2。在 python 中更准确的解决问题的方法是什么?

这是我解决问题的拙劣尝试(使用来自 Whosebug 的大量输入),其中 cos(2t) 的定义有效:

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()


        

*当我 运行 具有来自 cos(2t) 数据的插值函数的代码不起作用时...错误消息告诉

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. 

我真的看不懂。请帮忙...

转分题2

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

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

相当于

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

你构造 phinew 不是作为可调用函数而是作为值数组,将圆数组关闭到数组的插值函数。在导数函数中直接使用标量函数f

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

在 Mathematica 中,通常的方法很简单

iFunc = Interpolation[iData]

Interpolation[iData] 已经 returns 一个函数。