【发布时间】:2016-06-29 17:38:00
【问题描述】:
我想在像 ODE 这样的动态系统上进行集成
x_ddot + d*x_dot + k*x = a*sin(omega*t)
有一个修改:外力 a * sin(omega * t) 必须由另一个基于某些测量数据的周期信号代替。这意味着:我需要对我的离散测量数据进行曲线拟合,并且结果函数必须是周期性的。我有两个想法如何解决这个问题:
1) 使用傅里叶变换 (numpy.fft)。但是使用离散傅里叶变换很难从离散数据中生成连续函数。
2) 使用曲线拟合,函数如 a1+a2*sin(omega*t)+a3*sin(2*omega*t)+a4*sin(.... 其中 omega 为 2*pi/ (测量数据的长度)。不幸的是,这也不是很成功。我已经尝试结合 sin 和 cos 项并达到非常高的顺序 (...sin(10*omega*t)) 没有不要让它变得更好。
我真的很感激一些提示,请在下面查看我的示例数据代码:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import math as math
import scipy.special as sp
# create data
f = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.1,1.3,1.7,1.9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2.1,2.3,2.9,4.1,4.3,4.4,4.5,4.4,4,3.6,3.2,2.8,2.4,2.0,1.6,1.3,1.2,1.1,1,1,1,1,1]
alpha = np.linspace(0,len(f),len(f))
omega = 2*np.pi/len(f)
def func(alpha, a1, ac2, ac3, ac4, ac5, ac6, ac7):
fit = a1 + ac2*np.sin(omega*alpha) + ac3*np.sin(omega*2*alpha) + ac4*np.sin(omega*3*alpha) + ac5*np.sin(omega*4*alpha) + ac6*np.sin(omega*5*alpha) + ac7*np.sin(omega*6*alpha)
return fit
popt, pcov = curve_fit(func, alpha, f)
print popt
y_fit= func(alpha,popt[0],popt[1],popt[2],popt[3],popt[4],popt[5],popt[6])
plt.plot(alpha,f,'bo',label='discrete data')
plt.plot(alpha,y_fit,'r',label='periodic fit')
plt.legend()
plt.show()
【问题讨论】: