Как подогнать данные к неидеальному уравнению диода (неявная нелинейная функция) и получить параметры
Участок разбросанных данных
Мне нужно подогнать (x,y)-данные к уравнению с двумя переменными (x и y) и извлечь 5 неизвестных параметров.
Я делаю сценарий для обработки IV-данных (тока-напряжения) из простого.txt-файла и подгонки его к уравнению, называемому уравнением неидеального диода; это неявная нелинейная функция.
До сих пор я открывал файл с помощью python, сортировал данные в массивы, создавал точечные диаграммы необработанных данных, и я знаю, как должна выглядеть функция, которая должна быть подогнана. Я попытался определить уравнение и попробовал функции 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()
Код строит точки данных, но необходимо оптимизировать диодное уравнение, получить параметры и построить оптимизированное уравнение.
РЕДАКТИРОВАТЬ: Теперь вставлена попытка заставить Сципи оптимизировать неявную функцию
1 ответ
Было бы полезно опубликовать данные где-нибудь и указать характер полученной ошибки. То есть, дает ли Python исключение, соответствует ли сообщение об ошибке или выполняется сравнение до завершения, но это просто "не хорошо"?
Вы определенно хотите дать начальные значения для подходящих параметров. Это вне понимания того, что scipy.optimize.curve_fit()
позволяет пользователям не указывать начальные значения - должно быть ошибкой не указывать начальные значения. Задачи нелинейного подбора кривой, как правило, не являются глобальными оптимизациями, работают путем уточнения начальных значений и часто чувствительны к начальным значениям (особенно, когда имеет место экспоненциальный спад). FWIW, начальные значения, используемые, когда вы явно не указали начальные значения, равны "1" для всех параметров. Это хорошее значение по умолчанию? Нет.
Я также думаю, что у вас есть потенциально более серьезная проблема. Ваша модель для "у" трансцендентна: "у" зависит от "у". Я не узнаю формулу, которую вы используете, но могу поверить, что кривые IV для диодов трансцендентны. Если только вы не цените d
параметр << 1, я думаю, что ваша модель будет нестабильной. Вы можете убедиться, что d
ограничен, чтобы быть << 1, и почти наверняка не хотят начинать с d=1.
Вероятно, это не тот ответ, который вы искали, но я надеюсь, что он поможет вам выбрать правильный путь.