我是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/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.
我真的无法解读它们。请帮忙......
答案 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 ])