2015-10-11 3 views
1
import numpy as np 

import matplotlib.pyplot as plt 

from lmfit import minimize, Parameters, Parameter, report_fit 


# create data to be fitted 


x = np.linspace(0, 15, 301) 

data = (5. * np.sin(2 * x - 0.1) * np.exp(-x*x*0.025) + 

np.random.normal(size=len(x), scale=0.2)) 

# define objective function: returns the array to be minimized 


def fcn2min(params, x, data): 

    """ model decaying sine wave, subtract data""" 
    amp = params['amp'].value 
    shift = params['shift'].value 
    omega = params['omega'].value 
    decay = params['decay'].value 
    model = amp * np.sin(x * omega + shift) * np.exp(-x*x*decay) 


    return model - data 


# create a set of Parameters 

params = Parameters() 

params.add('amp', value= 10, min=0) 

params.add('decay', value= 0.1) 

params.add('shift', value= 0.0, min=-np.pi/2., max=np.pi/2) 

params.add('omega', value= 5.0) 


# do fit, here with leastsq model 

result = minimize(fcn2min, params, args=(x, data)) 


# calculate final result 

final = data + result.residual 


# try to plot results 
plt.plot(x,data,'k+') 

plt.plot(x,final,'r') 

plt.show() 

В этом коде я хочу вызвать параметры, такие как «amp», «shift» в python. Печать (amp) .. виды вещей Как назвать эти параметры в python после установки? Когда я использую print (amp), отображается сообщение об ошибке; name 'amp' не определен. Как распечатать эти параметры с помощью функции печати? (и т. д. print (amp))С использованием модуля lmfit в python, как вызвать параметры в модели?

+0

Это своего рода трудно понять, что вы действительно хотите или просить? Что работает в вашем коде, и что не работает? – holroy

+0

Если вы запустите код, вы можете найти код работает хорошо. Однако я хочу назвать параметры, такие как «amp» и «decay». Когда я использую print (amp), отображается сообщение об ошибке; name 'amp' не определен. Как распечатать эти параметры с помощью функции печати? (и т. д. print (amp)) – Swaim

ответ

0

Возможно, вы попытаетесь напечатать эти данные вне функции. Переменные amp, shift, omega и decay находятся в локальной области fc2min и поэтому доступны только внутри функции. Ваши навыки анализа данных, кажется, далеко превзойдет ваши Python ноу-хау, поэтому я добавил некоторые полезные советы в этом коде:

import numpy as np 
import matplotlib.pyplot as plt 
from lmfit import minimize, Parameters, Parameter, report_fit 

# create data to be fitted 
x = np.linspace(0, 15, 301) 
data = (5. * np.sin(2 * x - 0.1) * np.exp(-x*x*0.025) + 
np.random.normal(size=len(x), scale=0.2)) 

# define objective function: returns the array to be minimized 
def fcn2min(params, x, data): 

    """ model decaying sine wave, subtract data""" 
    amp = params['amp'].value 
    shift = params['shift'].value 
    omega = params['omega'].value 
    decay = params['decay'].value 
    model = amp * np.sin(x * omega + shift) * np.exp(-x*x*decay) 

    # tell Python we're modifying the model_data list 
    # that was declared outside of this function 
    global model_data 

    # store the model data produced by this function call 
    # add any data you want to display later to this "dictionary" 
    model_data += [{ 
     "amp": amp, 
     "shift": shift, 
     "omega": omega, 
     "decay": decay 
    }] 

    return model - data 


# create a set of Parameters 
params = Parameters() 
params.add('amp', value= 10, min=0) 
params.add('decay', value= 0.1) 
params.add('shift', value= 0.0, min=-np.pi/2., max=np.pi/2) 
params.add('omega', value= 5.0) 

# declare an empty list to hold the model data 
model_data = [] 

# do fit, here with leastsq model 
result = minimize(fcn2min, params, args=(x, data)) 

# print each item in the model data list 
for datum in model_data: 
    for key in datum: 

     #the 5 in %.5f controls the precision of the floating point value 
     print("%s: %.5f ") % (key, datum[key]), 
    print 


# calculate final result 
final = data + result.residual 

# try to plot results 
plt.plot(x,data,'k+') 
plt.plot(x,final,'r') 
plt.show() 
+0

Я использовал ваш код, а затем был создан eroor; неподдерживаемый тип (-ы) операндов для%: 'Nonetype' и 'tuple'. Как я могу его лечить? – Swaim

+0

Я редактирую ваш код print ((«% s:% .5f»)% (key, datum [key])), и он работает. – Swaim

+0

Затем, как получить только значение «amp» вне функции? Только внешняя привязка используется вне функции в вашем коде. – Swaim

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

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