如何将数据拟合到非理想二极管方程(隐式非线性函数)并检索参数 - python

散乱数据图

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

参考方案

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

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

我还认为您有一个可能更严重的问题。您的“ y”模型是先验的:“ y”取决于“ y”。我不知道您使用的公式,但我可以相信二极管的I-V曲线是超验的。除非您的d参数值是<< 1,否则我认为您的模型将不稳定。您可能要确保d的边界必须为<< 1,并且几乎可以肯定不希望以d = 1开头。

那可能不是您想要的答案,但是我希望它能帮助您走上正确的道路。

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…