Как подогнать данные к неидеальному уравнению диода (неявная нелинейная функция) и получить параметры - PullRequest
0 голосов
/ 15 января 2019

График разбросанных данных

Мне нужно подогнать (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 Ответ

0 голосов
/ 19 января 2019

Было бы полезно опубликовать данные где-нибудь и указать природу полученной вами ошибки. То есть, дает ли Python исключение, соответствует ли сообщение об ошибке или выполняется сравнение до завершения, но это просто "не хорошо"?

Вы определенно хотите дать начальные значения для подгоночных параметров. Непонятно, что scipy.optimize.curve_fit() позволяет пользователям не указывать начальные значения - это должно быть ошибкой, чтобы не указывать начальные значения. Задачи нелинейной аппроксимации кривой, как правило, , а не глобальные оптимизации, работают путем уточнения начальных значений и часто чувствительны к начальным значениям (особенно, когда имеет место экспоненциальный спад). FWIW, начальные значения, используемые, когда вы явно не указали начальные значения, равны «1» для всех параметров. Это хорошее значение по умолчанию? Нет, это не так.

Я также думаю, что у вас есть потенциально более серьезная проблема. Ваша модель для «у» трансцендентна: «у» зависит от «у». Я не узнаю формулу, которую вы используете, но я могу поверить, что кривые ВА для диодов трансцендентны. Если ваше значение параметра d не равно << 1, я думаю, что ваша модель будет нестабильной. Вы можете убедиться, что <code>d ограничен значением << 1, и почти наверняка не хотите начинать с d = 1. </p>

Возможно, это не тот ответ, который вы искали, но я надеюсь, что он поможет вам выбрать правильный путь.

...