【问题标题】:Python fitting sinus cardinal and LMFIT libraryPython 拟合 sinus cardinal 和 LMFIT 库
【发布时间】:2017-12-04 06:57:45
【问题描述】:

我有一组来自大学物理实验(简单狭缝实验)的数据,我正在尝试将这些数据拟合到我从 lmfit 库构建的模型中。 我想要一个窦性基数正方形,形式如下:

I(X)= I0.sinc²(pi.a.X/(lambda.D))

with a : 狭缝的宽度, lambda : 光的波长 D:距离相机/狭缝 I0 : 原始强度

import csv as csv
from math import pi
import matplotlib.pyplot as plt
import numpy as np
from lmfit import *

# create data to be fitted
with open('data_1.csv', 'r') as f:
    values = list(csv.reader(f, delimiter=','))
values = np.array(values[1:], dtype=np.float)

position = values[:, 0]
intensity = values[:, 1]

#define function model
def fct(x, I0, a, D, b):
    return I0 * np.square(np.sinc(pi * a * (x + b) / (0.00000063 * D)))
    #b is for the horizontal shift because my experience
    #was centered on 700 due to the camera

# do fit
vmodel = Model(fct)
vmodel.set_param_hint('I0', min=0., max=300.)
vmodel.set_param_hint('a', value=0.0005, min=0.0, max=1.)
vmodel.set_param_hint('D', value=0.53, min=0.0, max=1.)
vmodel.set_param_hint('b', min=0., max=2000.)
pars = vmodel.make_params()
result = vmodel.fit(intensity, pars, x=position)

# write report
print(result.fit_report())

#after we plot the data, with position on x and intensity on y

它返回完全错误的值和一个错误:

RuntimeWarning: invalid value encountered in double_scalars spercent = 
'({0:.2%})'.format(abs(par.stderr/par.value))

[[Model]]
    Model(fct)
[[Fit Statistics]]
    # function evals   = 7
    # data points      = 1280
    # variables        = 4
    chi-square         = 4058147.794
    reduced chi-square = 3180.367
    Akaike info crit   = 10326.876
    Bayesian info crit = 10347.494
[[Variables]]
    I0:   0          +/- 0        (nan%) (init= 0)
    a:    0.00050000 +/- 0        (0.00%) (init= 0.0005)
    D:    0.50000000 +/- 0        (0.00%) (init= 0.5)
    b:    400        +/- 0        (0.00%) (init= 400)

你能帮帮我吗?我从这个库中尝试了很多类型模型,但没有一个能正常工作,我真的需要它。我已经用 np.square 和其他阅读工具解决了 2D 问题,主要问题是模型。 等待答案, 谢谢,

【问题讨论】:

    标签: python physics lmfit


    【解决方案1】:

    您可能希望为所有参数值提供合理的起始值。正如您所写,I0b 没有初始值,但方便(?)这些参数设置了边界,因此可以将初始值(可能很差)推断为下限——我没有知道b 是如何变成 400 的。也许是错字?

    无论如何,我会建议尝试

    pars = vmodel.make_params(I0=150, b=400)
    

    然后再试一次。

    【讨论】:

    • 感谢您的回答。我在程序中更改了一些东西,添加了更小的间隔并设置了一些参数以保持不变,但它不起作用,结果总是很糟糕。你想要修改后的代码吗?
    • 好吧,发布一个简单工作示例的完整代码(带有数据)可能会有所帮助。另一个建议是使用您的初始参数值将数据与模型一起绘制,看看它是否与您的数据非常匹配。
    猜你喜欢
    • 2014-06-18
    • 2018-10-20
    • 2014-12-17
    • 2015-07-04
    • 2021-08-09
    • 2016-10-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多