【发布时间】:2021-11-15 15:51:58
【问题描述】:
使用lmfit.minimize时如何对参数设置条件?
from lmfit import Parameters,minimize, fit_report
import numpy as np
x = np.linspace(0,10,100)
y = 2.39645 * x**2 + np.random.normal(0, 2, 100)
def fun1(params,x,y):
k1 = params['k1']
k2 = params['k2']
k3 = params['k3']
y_fit = k1*x**2 + k2*x + k3
return y_fit-y
# Defining the various parameters
params = Parameters()
params.add('k1', value = 1)
params.add('k2', value = 1)
params.add('k3', value = 1)
fitted_params = minimize(fun1, params, args=(x,y,), method='least_squares')
这给出了最优的 k1、k2 和 k3
name value standard error relative error initial value min max vary
k1 2.42637846 0.02748469 (1.13%) 1 -inf inf True
k2 -0.43530957 0.28403716 (65.25%) 1 -inf inf True
k3 1.02895856 0.61456597 (59.73%) 1 -inf inf True
我想对 k1、k2 和 k3 施加约束,使得:k1>k2>k3。我该怎么做?
编辑
我已经介绍了两个参数delta1和delta2如下-
# Defining the various parameters
params = Parameters()
params.add('k1', value = 1)
params.add('delta1', value = 1, min = 0)
params.add('k2', value = 1, expr = "k1 - delta1")
params.add('k2', value = 1)
params.add('delta2', value = 1, min = 0)
params.add('k3', value = 1, expr = "k2 - delta2")
#fitting function
fitted_params = minimize(fun1, params, args=(x,y,), method='least_squares')
#Printing parameters
fitted_params.params.pretty_print()
新的参数如下-
Name Value Min Max Stderr Vary Expr Brute_Step
delta1 1.726 0 inf None True None None
delta2 2.833e-11 0 inf None True None None
k1 2.398 -inf inf None True None None
k2 -0.01788 -inf inf None True None None
k3 -0.01788 -inf inf None False k2 - delta2 None
我们在新参数中有 k1>k2>k3,但 k2 和 k2 几乎相同。是否可以采取一些措施来避免这种情况,或者这些是基于给定约束的最佳解决方案?
【问题讨论】:
标签: python optimization curve-fitting lmfit