散乱数据图
我需要将(x,y)数据拟合到具有两个变量(x和y)的方程式中,并检索5个未知参数。
我正在编写一个脚本,以处理来自简单.txt文件的IV数据(电流电压),并将其拟合为一个方程,称为非理想二极管方程;这是一个隐式非线性函数。
到目前为止,我已经使用python打开了文件,将数据分类为numpy数组,绘制了原始数据的散点图,并且我知道要适合的函数的外观。我尝试定义方程式,并尝试了SciPy函数fsolve和curve_fit,但是却没有运气(也许我不好用它们)。
我只需要简单地将数据拟合到以下方程式,检索参数并绘制实际曲线即可:
y = a-b *(np.exp((x-y * d)/ c)-1)-(x + y * d)/ e
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
OpenFile = pd.read_csv("test.txt", sep="\t", header=0)
FileArray = np.array(OpenFile)
x = FileArray[:, 0]
y = FileArray[:, 1] * 1000.0 / 0.08
plt.scatter(x, y)
def diode(data, a, b, c, d, e):
v, j = data
return a - b * (np.exp((v - j * d) / c) - 1) - (v + j * d) / e - j
### FAILED SCIPY OPTIMIZE ATTEMPT ###
parameters, parameterscovariance = optimize.curve_fit(diode, (x,y), y,
bounds = ([0, 0, 0, 0, 0],
[np.inf, np.inf, np.inf, np.inf, np.inf]),
max_nfev=10000)
plt.plot(x, diode((x,y), parameters[0], parameters[1], parameters[2], parameters[3], parameters[4]))
plt.show()
代码绘制了数据点,但需要优化二极管方程,检索参数并绘制优化方程。
编辑:现在插入了使scipy优化隐式函数的尝试
答案 0 :(得分:0)
将数据发布到某处并给出失败的性质将很有帮助。也就是说,Python是否会给出异常,是否契合会给出错误消息,或者契合运行到完成但契合只是“不好”?
您绝对想为拟合参数提供初始值。毫无疑问,scipy.optimize.curve_fit()
允许用户不指定初始值-不指定初始值应该是错误的。非线性曲线拟合问题通常不是全局优化,而是通过优化初始值来起作用,并且通常对初始值敏感(尤其是在涉及指数衰减时)。 FWIW,当您未明确声明所有参数的初始值时,使用的初始值为“ 1”。这是一个好的默认值吗?不,不是。
我还认为您有一个可能更严重的问题。您的“ y”模型是先验的:“ y”取决于“ y”。我不知道您使用的公式,但我可以相信二极管的I-V曲线是超验的。除非您的d
参数的值是<< 1,否则我认为您的模型将不稳定。您可能要确保d
的边界必须<< 1,并且几乎可以肯定不希望以d = 1开头。
这可能不是您想要的答案,但我希望它能帮助您走上正确的道路。