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

时间:2017-05-07 10:09:01

标签: python wolfram-mathematica numerical-methods differential-equations

我是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中更准确地解决问题的方法呢?

这是我谦虚地尝试解决问题(来自StackOverflow的大量输入),其中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 个答案:

答案 0 :(得分:1)

在Mathematica中,通常的方法就是

iFunc = Interpolation[iData]

Interpolation[iData]已经返回一个函数。

答案 1 :(得分:0)

要提问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 ])