2

分散数据图

我需要将 (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 优化隐式函数

4

1 回答 1

0

将数据发布到某处并给出您遇到的故障的性质会很有帮助。也就是说,Python 是否给出异常,拟合是否给出错误消息,或者拟合是否运行完成但拟合只是“不好”?

肯定想为拟合参数提供初始值。允许用户不指定起始值是无法理解的scipy.optimize.curve_fit()——不指定初始值应该是错误的。非线性曲线拟合问题通常不是全局优化,通过优化起始值来工作,并且通常对初始值敏感(尤其是在涉及指数衰减时)。FWIW,当您没有明确说明所有参数的初始值时使用的初始值是“1”。这是一个好的默认值吗?不它不是。

我也认为你有一个可能更严重的问题。你的“y”模型是超越的:“y”取决于“y”。我不认识您使用的公式,但我可以相信二极管的 IV 曲线是超越的。除非您的d参数值 << 1,否则我认为您的模型将不稳定。您可能希望确保d有界为 << 1,并且几乎可以肯定不希望从 d=1 开始。

这可能不是您正在寻找的答案,但我希望它可以帮助您走上正确的道路。

于 2019-01-19T03:23:49.880 回答