如何提升numpy曲线拟合效果

0 投票
2 回答
1599 浏览
提问于 2025-04-17 23:53

我有一些来自太阳能充电器的数据,记录了时间和电流,我想给这些数据画一条曲线。数据集(时间已经用matplotlib.dates.date2num转换过)可以在这个链接找到:http://pastebin.com/4FAMbbCJ。我把时间放进了一个叫做Time的列表里,把电流放进了Current。

import numpy
import matplotlib.pyplot as plt

fit = numpy.polyfit(Time, Current, 10)
fit_fxn = numpy.poly1d(fit)

plt.figure(1)
plt.subplot(211)
plt.plot_date(Time, Current, '-r', xdate=True, ydate=False)
plt.title("Current flow over time")
plt.ylabel("milliAmps")
plt.xlabel("Time")

plt.subplot(212)
plt.plot_date(Time, fit_fxn(Time), '-r', xdate=True, ydate=False)
plt.title("Current fxn with time")

plt.show()

散点图看起来不错,但无论我用polyfit尝试多少个系数,最后得到的结果还是一条大致的直线。编辑:从我的观察来看,电流在中午时会有一个峰值,这和太阳能发电的预期是一样的,但曲线却把最大电流放在了最早的时间,然后从那里开始下降,形成了一条直线。我想加一张图片,但我的声望点不够。我觉得问题更可能出在我的实现上,而不是polyfit,我只是想看看我哪里搞错了。

有没有人有什么好主意,能帮我找到更好的曲线呢?

2 个回答

0

我也遇到过同样的问题。我发现如果数字太大,适配就会出问题。试着调整一下你的单位大小,这对我有用。

1

这其实是自变量的问题。你使用的是10次多项式,这样的话,结果可能会像4.5e+58这么大。这就意味着你的系数必须非常小,这样会导致精度丢失。

试着把时间变量减去它的最小值,看看效果。

import numpy
import matplotlib.pyplot as plt
t = Time-Time.min()

fit = numpy.polyfit(t, Current, 10)
fit_fxn = numpy.poly1d(fit)

plt.figure(1)
plt.subplot(211)
plt.plot_date(Time, Current, '-r', xdate=True, ydate=False)
plt.title("Current flow over time")
plt.ylabel("milliAmps")
plt.xlabel("Time")

plt.subplot(212)
plt.plot_date(Time, fit_fxn(t), '-r', xdate=True, ydate=False)
plt.title("Current fxn with time")

plt.show()

撰写回答