2016-12-11 12 views
1

У меня есть наборы данных, которые я хотел бы, чтобы соответствовать двум уравнениям:Как оптимизировать и найти коэффициенты для двух уравнений одновременно в Python 2.7?

y1 = a1 + a2 * T/2 + a3 * T^2/3 + a4 * T^3/4 + a5 * T^4/5 + а6/Т
у2 = а1 * ЛСТ + а2 * Т + а3 * T^2/2 + а4 * Т^3/3 + а5 * Т^4/4 + а7

Два полиномы имеют некоторые параметры (от a1 до a5), поэтому я хотел бы подобрать эти два уравнения одновременно.

Я пытался сделать это с scipy.optimize.curve_fit:

import numpy as np 
from scipy.optimize import curve_fit 

def func(T, a1, a2, a3, a4, a5, a6, a7): 
    y1 = a1 + a2 * T/2 + a3 * T**2/3 + a4 * T**3/4 + a5 * T**4/5 + a6/T 
    y2 = a1*np.log(T) + a2*T + a3 * T**2/2 + a4 * T**3/4 + a5 * T**4/4 + a7 
    return np.stack((y1, y2), axis = 1) 

T = np.linspace(300, 1000, 20) 
ydata_1 = np.array([ 
    0.02139265, 0.40022353, 0.70653103, 0.95896469, 1.17025634, 
    1.34944655, 1.50316659, 1.63641239, 1.75303086, 1.85603601, 
    1.94782051, 2.03030092, 2.10501971, 2.17321829, 2.23589026, 
    2.29382086, 2.34761661, 2.39772787, 2.44446625, 2.48801814]) 

ydata_2 = np.array([ 
    15.73868267, 16.14232408, 16.50633034, 16.83724622, 
    17.14016153, 17.41914701, 17.67752993, 17.91807535, 
    18.14310926, 18.35460465, 18.55424316, 18.74346017, 
    18.92347836, 19.09533317, 19.25989235, 19.41787118, 
    19.56984452, 19.71625632, 19.85742738, 19.99356154]) 

ydata = np.stack((ydata_1, ydata_2), axis = 1) 
popt, pconv = curve_fit(f = func, xdata = T, ydata = ydata) 

Однако я получаю ошибку:

minpack.error: Result from function call is not a proper array of floats. 

Я даже не уверен, что это правильный подход к решению проблема.

ответ

1

Вы можете попытаться минимизировать норму l_2 (т.е. по методу наименьших квадратов) в 2-мерном пространстве для ваших у-значений:

from scipy.optimize import minimize 

def func(params): 
    a1, a2, a3, a4, a5, a6, a7 = params 
    y1 = a1 + a2 * T/2 + a3 * T**2/3 + a4 * T**3/4 + a5 * T**4/5 + a6/T 
    y2 = a1*np.log(T) + a2*T + a3 * T**2/2 + a4 * T**3/4 + a5 * T**4/4 + a7 
    return np.sum((y1 - ydata_1) ** 2 + (y2 - ydata_2) ** 2) 

T = np.linspace(300, 1000, 20) 
ydata_1 = np.array([ 
    0.02139265, 0.40022353, 0.70653103, 0.95896469, 1.17025634, 
    1.34944655, 1.50316659, 1.63641239, 1.75303086, 1.85603601, 
    1.94782051, 2.03030092, 2.10501971, 2.17321829, 2.23589026, 
    2.29382086, 2.34761661, 2.39772787, 2.44446625, 2.48801814]) 

ydata_2 = np.array([ 
    15.73868267, 16.14232408, 16.50633034, 16.83724622, 
    17.14016153, 17.41914701, 17.67752993, 17.91807535, 
    18.14310926, 18.35460465, 18.55424316, 18.74346017, 
    18.92347836, 19.09533317, 19.25989235, 19.41787118, 
    19.56984452, 19.71625632, 19.85742738, 19.99356154]) 

# choose reasonable values for your 7 parameters here, 
# i.e. close to the "right" answer, this may take a few tries 
first_guess = [a1_0, a2_0, a3_0, a4_0, a5_0, a6_0, a7_0] 

# here we run the minimisation 
res = minimize(func, first_guess) 

# this is an array of your best fit values for a1-a7 
best_fit = res.x 

Тем не менее, кажется, что @Stelios прав в том, что вы будете иметь трудно найти подходящую модель.

1

(расширенный комментарий)

а) curve_fit используется, чтобы соответствовать функции одного на основе одного данных. В вашем случае у вас есть две функции, которые подходят для двух наборов данных. Это требует, в принципе, постановки задачи оптимизации с нуля, т. Е. Определения объектной функции (с ограничениями или без ограничений). Целевая функция могла бы быть, например, суммой квадратов остаточных ошибок обоих вариантов. Затем вы можете использовать оптимизатор оптимизации, такой как scipy.optimimize.minimize, чтобы найти оптимальные переменные.

b) Ваша модель (функции фитинга), вероятно, приведет к численным трудностям в оптимизации. Например, переменные a5 и a6 для y1 являются факторами для T**4 и 1/T соответственно, что для T=10**3 соответствует значениям 10**12 и 10**-3. Это огромная разница в масштабах, близкая к аппаратной точности, которая подсказывает мне, что вы должны пересмотреть свою модель.

+0

Я вижу. Спасибо! Я хочу, чтобы я мог использовать другую модель, но я использую другую программу, которая требует этого формата. –

 Смежные вопросы

  • Нет связанных вопросов^_^