我做了一个代码,把数据拟合到正弦图上。但效果不好
import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
def f(x, a, b, c, d):
return (a)*np.sin((b)*x+(c))+(d)
df = pd.read_csv("./data.csv", usecols = ['t3','Vz'])
#df=pd.read_csv("E:/2023/spring/프밍기/codes/data.csv")
data_need = df.iloc[range(249), [0, 1]]
x = np.array(data_need['t3'])
y = np.array(data_need['Vz'])
popt, pcov = curve_fit(f, x, y)
a, b, c, d = popt
formatted_a = "{:.3f}".format(a)
formatted_b = "{:.3f}".format(b)
formatted_c = "{:.3f}".format(c)
formatted_d = "{:.3f}".format(d)
function_expression = f"y = {formatted_a} * sin({formatted_b}x + {formatted_c}) + {formatted_d}"
print(function_expression)
import matplotlib.pyplot as plt
plt.scatter(x, y, marker='.')
plt.plot(x, y, linewidth=2)
plt.plot(x, f(x, *popt), color='red', linewidth=2)
plt.legend(['Original', 'Best Fit'], loc=2)
plt.show()
输出如下:
我想知道为什么结果不好,还有其他方法可以在python中进行曲线拟合。
3条答案
按热度按时间66bbxpm51#
有多个软件包来执行各种拟合和/或建模任务。
任何曲线拟合/最小二乘最小化的一个特征是,您需要提供参数的初始猜测。如果初始猜测非常偏离,则最小化可能根本不收敛,或者收敛到次优解。
在本例中,您没有指定初始猜测,
scipy.optimize.curve_fit
使用了一些值,结果不好;所以首先要做的就是指定它。你可以从数据范围粗略估计振幅,从峰到峰距离粗略估计频率等。并去除数据流开始零补丁。
vql8enpb2#
x33g5p2x3#
正弦曲线拟合很容易失败,所以不要尝试。执行FFT并观察峰值。从Numpy执行
rfft
。它将更加健壮,并且不需要边界或初始猜测就能很好地工作。