当前位置: 首页 > 知识库问答 >
问题:

我如何才能适应一个良好的洛伦兹Python使用scipy.optimize.curve_fit?

岳泳
2023-03-14

我试图用一个以上的吸收峰(穆斯堡尔谱)拟合洛伦兹函数,但曲线拟合函数不能正常工作,只能拟合几个峰。我怎样才能适应它?

图:尝试调整多重洛伦兹

下面我展示我的代码。请帮帮我。

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

def mymodel_hema(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4,c4,a5,b5,c5,a6,b6,c6):
    f =  160000 - (c1*a1)/(c1+(x-b1)**2) - (c2*a2)/(c2+(x-b2)**2) - (c3*a3)/(c3+(x-b3)**2) - (c4*a4)/(c4+(x-b4)**2) - (c5*a5)/(c5+(x-b5)**2) - (c6*a6)/(c6+(x-b6)**2)
    return f

def main():
    abre = np.loadtxt('HEMAT_1.dat')
    x = np.zeros(len(abre))
    y = np.zeros(len(abre))

    for i in range(len(abre)):
       x[i] = abre[i,0]
       y[i] = abre[i,1]

    popt,pcov = curve_fit(mymodel_hema, x, y,maxfev=1000000000)

我的数据--

共有1个答案

穆宾白
2023-03-14

此代码使用leastsq而不是curve\u fit,因为后者需要固定数量的参数。这里我不想这样,因为我让代码“决定”有多少个峰值。请注意,我缩放了数据以简化拟合。真正的拟合参数可以很容易地通过缩尺(和标准误差传播)进行计算

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq

def lorentzian( x, x0, a, gam ):
    return a * gam**2 / ( gam**2 + ( x - x0 )**2)

def multi_lorentz( x, params ):
    off = params[0]
    paramsRest = params[1:]
    assert not ( len( paramsRest ) % 3 )
    return off + sum( [ lorentzian( x, *paramsRest[ i : i+3 ] ) for i in range( 0, len( paramsRest ), 3 ) ] )

def res_multi_lorentz( params, xData, yData ):
    diff = [ multi_lorentz( x, params ) - y for x, y in zip( xData, yData ) ]
    return diff

xData, yData = np.loadtxt('HEMAT_1.dat', unpack=True )
yData = yData / max(yData)

generalWidth = 1

yDataLoc = yData
startValues = [ max( yData ) ]
counter = 0

while max( yDataLoc ) - min( yDataLoc ) > .1:
    counter += 1
    if counter > 20: ### max 20 peak...emergency break to avoid infinite loop
        break
    minP = np.argmin( yDataLoc )
    minY = yData[ minP ]
    x0 = xData[ minP ]
    startValues += [ x0, minY - max( yDataLoc ), generalWidth ]
    popt, ier = leastsq( res_multi_lorentz, startValues, args=( xData, yData ) )
    yDataLoc = [ y - multi_lorentz( x, popt ) for x,y in zip( xData, yData ) ]

print popt
testData = [ multi_lorentz(x, popt ) for x in xData ]

fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.plot( xData, yData )
ax.plot( xData, testData )
plt.show()

提供

[ 9.96855817e-01  4.94106598e+02 -2.82103813e-01  4.66272773e+00
  2.80688160e+01 -2.72449246e-01  4.71728295e+00  1.31577189e+02
 -2.29698620e-01  4.20685229e+00  4.01421993e+02 -1.85917255e-01
  5.57859380e+00  2.29704607e+02 -1.47193792e-01  3.91112196e+00
  3.03387957e+02 -1.37127711e-01  4.39571905e+00]

 类似资料:
  • 我正在尝试使用scipy拟合布里渊光谱(具有多个峰)。优化曲线拟合。我有多个光谱和几个峰,我试图用洛伦兹函数拟合它们(每个峰一个洛伦兹函数)。我正在尝试自动化批量分析过程(即,使用scipy的峰值查找算法获得峰值位置、峰值宽度和峰值高度,并将其用作拟合的初始猜测)。我现在正在研究一个光谱,看看总体思路是否可行,然后我会将其扩展为自动光谱,并处理我所有的光谱。到目前为止,我已经做到了: 其中y_pe

  • 本文向大家介绍你觉得如何才能取出一个好的标题?相关面试题,主要包含被问及你觉得如何才能取出一个好的标题?时的应答技巧和注意事项,需要的朋友参考一下 同样是标题的问题,也可以从不同方向来答,标题套路再多但遵循原则却只有5个。 符合各平台运营规则(百家、头条、大于等都有相关标题运营规则) 不背离文章内容本身(标题是对文案内容精髓的提炼,而不是夸大其词) 贴近用户(普罗大众更喜欢看通俗易懂的词汇,而知识

  • 问题内容: 在以下示例中,将显示初始图标,但在类更改时它不会更改。 问题答案: BO41是正确的,它是字体真棒的javascript,不会重新渲染。如果您可以不使用新的font-awesome svg / javascript图标,可以将font-awesome用作css的网络字体。 在index.html中,删除fontawesome脚本,然后添加font-awesome css样式表: 您的代

  • 我正在开发一个web应用程序,该应用程序利用了Google Maps Directions API。我试图在一些动态创建的方向下面创建一个超链接(使用lat/lon坐标作为航路点),这将允许移动用户在他们的移动设备上查看和交互相同的方向。 作为一个例子,我已经创建了一个方向链接与3个航路点从LAT/LON对。第一个是亚特兰大西南部(33.67,-84.61)。其次是偏北(34.01,-84.33)

  • 我在评估卡桑德拉。我正在使用datastax驱动程序和CQL。 我必须能够处理每秒至少1000个宽行插入,使用不同但数量很大(~1000)的名称/值对。 问题是:我编写了一个简单的基准测试,它执行1000个宽行插入,每个插入10000个名称/值对。我使用CQL和datastax驱动程序的性能非常慢,而不使用CQL的版本(使用astyanax)在相同的测试集群上有很好的性能。 我已经读过这个相关的问