Использование массива в ошибке функции - PullRequest
0 голосов
/ 28 апреля 2018

Когда я запускаю свой код, я получаю сообщение об ошибке "неподдерживаемые типы операндов для ** или pow (): 'numpy.ufunc' и 'float'"

Код:

import numpy as np
import matplotlib.pyplot as plt
from numpy import sqrt,exp,log
from scipy import linalg
from scipy.optimize import curve_fit

data1 = np.loadtxt('decay1.txt', float,skiprows=1)
t = data1[:,0]
n = data1[:,1]

data2 = np.loadtxt('decay2.txt', float,skiprows=1)
T = data2[:,0]
N = data2[:,1]

def Radio(n,t,tao,b):
    return (n*(exp**(-(t/tao)))) + b

guesses = (1,1,1)
guesses2 = (1,1,1)

(p0,p1,p2),cc = curve_fit(Radio,t,n,guesses)
(p02,p12,p22),cc2 = curve_fit(Radio,T,N,guesses2)

yfit = Radio(t,p0,p1,p2)
y2fit = Radio(T,p02,p12,p22)

Я должен приспособить функцию к данным радиоактивного распада, поэтому скажите мне, если я также испортил код, чтобы приспособить функцию к нему. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 28 апреля 2018

numpy.exp - экспоненциальная функция, а ** - оператор мощности, поэтому вы пытаетесь повысить определение функции до степени (-(t/tao)). Я думаю, что вы хотели

def Radio(n,t,tao,b):
    return (n*(exp(-(t/tao)))) + b

Что касается использования функции оптимизации, то здесь есть пара вопросов. Во-первых, вы используете n как параметр (внутри метода Radio), так и данные зависимых переменных (из условия задачи), что сбивает с толку. Я бы изменил это на что-то вроде a (как это используется в документообороте кривой . Это не совсем необходимо, но помогает удобочитаемости.

Во-вторых, и, что более важно, подходящая функция должна иметь независимую переменную (в данном случае t) в качестве аргумента first . Я думаю, что причиной плоского подбора является то, что вы фактически подгоняете кривую n->Radio(n) (со всеми этими другими переменными в качестве параметров) вместо t->Radio(t).

...