Подгонка функции к экспериментальным данным с использованием curve_fit с двумя независимыми переменными - PullRequest
0 голосов
/ 27 марта 2019

Я хочу подогнать кривую к своему экспериментальному набору данных, и я действительно не знаю, как это сделать.Я искал возможности, и я наткнулся на curve_fit (а также least_suqares), который, кажется, подходит для этой задачи, но я все еще очень незнаком с тем, как это работает, так как я изо всех сил пытаюсь получить это вмоя толстая головаЯ начал свою попытку с определения начальных значений:

import numpy as np
import math
from scipy.optimize import curve_fit, least_squares

f_exp = np.array([1, 1.6, 2.7, 4.4, 7.3, 12, 20, 32, 56, 88, 144, 250000])
e_exp = np.array([7.15, 7.30, 7.20, 7.25, 7.26, 7.28, 7.32, 7.25, 7.35, 7.34, 7.37, 13.55])

n_e_exp = len(e_exp)

ezero     = 7.15
einf      = 13.55
fc        = np.arange(1,11000,1000)
alpha     = np.arange(0,1.1,0.1)

log_f_mod = np.arange(-3, 6.5, 0.5)
f_mod     = 10 ** log_f_mod

n_f_mod   = len(f_mod)
n_fc      = len(fc)
n_alpha   = len(alpha)  

x         = np.zeros((n_f_mod, n_fc))
for j in range(n_f_mod):
        for k in range(n_fc):
            x[j,k] = np.log(f_mod[j] / fc[k])

Обратите внимание, что x является функцией fc.Теперь я определяю функцию, которую хочу запустить, используя curve_fit, least_squares или другую более подходящую функцию:

def c_c_eRI(einf, ezero, alpha, x):
    eR    = einf + 1/2 * (ezero - einf) * (1 - np.sinh((1 - alpha) * x) / (np.cosh((1 - alpha) * x) + np.cos(alpha * math.pi / 2))) 
    eI    = np.abs(1/2 * (ezero - einf) * np.cos(alpha * math.pi / 2) / (np.cosh((1 - alpha) * x) + np.sin(alpha * math.pi / 2)))
    eRI   = np.sqrt(eR ** 2 + eI ** 2)
    return eRI

На этом этапе я пытался заставить ее работать без каких-либоудача:

fit = curve_fit(c_c_eRI, f_exp, e_exp)
  • Есть ли способ использовать функцию (например, curve_fit, least_squares или какую-то другую) для подгонки кривой к экспериментальным данным и одновременно предоставляют значения независимых переменных, которые alpha и fc (от которых x является функцией) , которые используются для достижения самого соответствия?

Другими словами, цель состоит в том, чтобы найти значения alpha и fc (от которых x является функцией), которые обеспечивают наилучшее возможное соответствие f_exp против e_exp аналогично тому, как решатель EXCEL находит минимальные квадратные невязки, варьируя alpha и fc.

Конечная цель - для построения f_exp против e_expа также подгоночную кривую, используя matplotlib - я также немного растерялся, как это сделать.

Я прошу прощения заотсутствие более обобщенного примера.

1 Ответ

1 голос
/ 27 марта 2019

Если я правильно понял ваш пример, я думаю, что вам просто нужно изменить определение функции на

def c_c_eRI(x, einf, ezero, alpha):
    ...

Из кривой_файловой документации : The model function, f(x, …). It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments.

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