Fmin Python передавая параметры - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь найти минимум функции func_exp.Функция имеет 3 параметра, которые я получаю из примерки.Затем я хочу найти минимальное значение (у) функции вдоль оси х.При использовании подобранных параметров.Для этого я пытаюсь использовать fin от scipy

Однако я, похоже, не очень понимаю, как передать аргументы функции fin.с текущим кодом я получаю следующую ошибку:

ValueError: установка элемента массива с последовательностью.

за любую помощь, я буду благодарен.

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from scipy.optimize import fmin

def func_exp(x,a,b,c):
   return -a*(1-(1-np.exp(-b*(x-c)))**2)

class morse:
    def __init__(self):
        self.masses = {'H': 1, 'D': 2, 'C': 12, 'O': 16}

def exponential_regression (self,x_data, y_data):
    self.popt, pcov = curve_fit(func_exp, x, y, p0 = (0.5, 1.4, 3))
    print(self.popt)
    puntos = plt.plot(x, y, 'x', color='xkcd:maroon', label = "data")
    x_data= np.linspace(np.amax(x),np.amin(x),100)
    curva_regresion = plt.plot(x_data, func_exp(x_data, *self.popt), color='xkcd:teal', label = "fit: {:.3f}, {:.3f}, {:.3f}".format(*self.popt))
    plt.xlim([2, 5.5 ])
    plt.ylim([-5.5, 5 ])
    plt.legend()
    plt.show()
    return func_exp(x, *self.popt)

if __name__ == "__main__":
    x = np.array([2.5,3,3.125,3.25,3.375,3.5,3.625,3.75,4,4.5,5,5.5])
    y = np.array([17.27574826,-3.886390266,-4.892678401,-5.239229709,-5.193942987,-4.93131152,-4.557452444,-4.13446237,-3.276524893,-1.928242445,-1.17731394,-0.745240026])
    morse=morse()
    morse.exponential_regression(x, y)
    fmin(func_exp,x,args=(morse.popt[0],morse.popt[1],morse.popt[2]))

1 Ответ

0 голосов
/ 20 декабря 2018

Хорошо, я нашел решение.Здесь необходимо изменить только одно начальное значение предположения x на fmin.Вы передавали x длиной 12.

Замените

fmin(func_exp,x,args=(morse.popt[0],morse.popt[1],morse.popt[2]))

на

fmin(func_exp,x[0],args=(morse.popt[0],morse.popt[1],morse.popt[2]))

, где вы используете только первый элемент массива xв качестве отправной точки.

Вы также можете использовать другие значения как x[1] или x[-1], и все они будут сведены к минимуму.Теперь функция вернет вам значение x, для которого кривая имеет минимум.Ответ

array([3.30895996])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...