gpt4 book ai didi

python - 使用 Python 和 lmfit 拟合复杂模型?

转载 作者:太空狗 更新时间:2023-10-30 00:17:26 24 4
gpt4 key购买 nike

我想适合ellipsometric使用 LMFit 将数据转换为复杂模型。 psidelta 这两个测量参数是复杂函数 rho 中的变量。

我可以尝试使用 shared parameters 将问题分为实部和虚部或 piecewise方法,但是有没有办法直接用复杂的函数来做呢?仅拟合函数的实部效果很好,但是当我定义复杂的残差函数时,我得到:

TypeError: no ordering relation is defined for complex numbers.

下面是我的实函数拟合代码和我尝试解决复杂拟合问题的尝试:

    from __future__ import division
from __future__ import print_function
import numpy as np
from pylab import *
from lmfit import minimize, Parameters, Parameter, report_errors


#=================================================================
# MODEL

def r01_p(eps2, th):
c=cos(th)
s=(sin(th))**2

stev= sqrt(eps2) * c - sqrt(1-(s / eps2))
imen= sqrt(eps2) * c + sqrt(1-(s / eps2))
return stev/imen

def r01_s(eps2, th):
c=cos(th)
s=(sin(th))**2

stev= c - sqrt(eps2) * sqrt(1-(s/eps2))
imen= c + sqrt(eps2) * sqrt(1-(s/eps2))
return stev/imen


def rho(eps2, th):
return r01_p(eps2, th)/r01_s(eps2, th)

def psi(eps2, th):
x1=abs(r01_p(eps2, th))
x2=abs(r01_s(eps2, th))
return np.arctan2(x1,x2)

#=================================================================
# REAL FIT
#

#%%

# generate data from model
th=linspace(deg2rad(45),deg2rad(70),70-45)
error=0.01
var_re=np.random.normal(size=len(th), scale=error)
data = psi(2,th) + var_re

# residual function
def residuals(params, th, data):
eps2 = params['eps2'].value

diff = psi(eps2, th) - data
return diff

# create a set of Parameters
params = Parameters()
params.add('eps2', value= 1.0, min=1.5, max=3.0)


# do fit, here with leastsq model
result = minimize(residuals, params, args=(th, data),method="leastsq")

# calculate final result
final = data + result.residual

# write error report
report_errors(params)


# try to plot results
th, data, final=rad2deg([th, data, final])
try:
import pylab
clf()
fig=plot(th, data, 'r o',
th, final, 'b')
setp(fig,lw=2.)
xlabel(r'$\theta$ $(^{\circ})$', size=20)
ylabel(r'$\psi$ $(^{\circ})$',size=20)

show()

except:
pass

#%%
#=================================================================
# COMPLEX FIT

# TypeError: no ordering relation is defined for complex numbers

"""
# data from model with added noise
th=linspace(deg2rad(45),deg2rad(70),70-45)
error=0.001
var_re=np.random.normal(size=len(th), scale=error)
var_im=np.random.normal(size=len(th), scale=error) * 1j

data = rho(4-1j,th) + var_re + var_im


# residual function
def residuals(params, th, data):
eps2 = params['eps2'].value

diff = rho(eps2, th) - data
return np.abs(diff)

# create a set of Parameters
params = Parameters()
params.add('eps2', value= 1.5+1j, min=1+1j, max=3+3j)


# do fit, here with leastsq model
result = minimize(residuals, params, args=(th, data),method="leastsq")

# calculate final result
final = data + result.residual

# write error report
report_errors(params)
"""
#=================================================================

编辑:我解决了虚部和实部分离变量的问题。数据的形状应为 [[imaginary_data],[real_data]],目标函数必须返回一维数组。

def objective(params, th_data, data):
eps_re = params['eps_re'].value
eps_im = params['eps_im'].value
d = params['d'].value

residual_delta = data[0,:] - delta(eps_re - eps_im*1j, d, frac, lambd, th_data)
residual_psi = data[1,:] - psi(eps_re - eps_im*1j, d, frac, lambd, th_data)

return np.append(residual_delta,residual_psi)

# create a set of Parameters
params = Parameters()
params.add('eps_re', value= 1.5, min=1.0, max=5 )
params.add('eps_im', value= 1.0, min=0.0, max=5 )
params.add('d', value= 10.0, min=5.0, max=100.0 )


# All available methods
methods=['leastsq','nelder','lbfgsb','anneal','powell','cobyla','slsqp']
# Chosen method
#metoda='leastsq'

# run the global fit to all the data sets
result = minimize(objective, params, args=(th_data,data),method=metoda))

....

return ...

最佳答案

lmfit FAQ建议使用 numpy.ndarray.view 简单地获取实部和虚部。 ,这意味着您无需手动完成实部和虚部的分离。

def residuals(params, th, data):
eps2 = params['eps2'].value

diff = rho(eps2, th) - data
# The only change required is to use view instead of abs.
return diff.view()

关于python - 使用 Python 和 lmfit 拟合复杂模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com