Я очень, очень новичок в python, поэтому, пожалуйста, несите меня и прощайте мою наивность. Я использую Spyder Python 2.7 на своем ноутбуке Windows. Как следует из названия, у меня есть некоторые данные, теоретическое уравнение, и я пытаюсь подгонять мои данные, и я считаю, что это хи-квадрат. Теоретическое уравнение я использую Подгонка теоретического уравнения к моим данным
import math
import numpy as np
import scipy.optimize as optimize
import matplotlib.pylab as plt
import csv
#with open('1.csv', 'r') as datafile:
# datareader = csv.reader(datafile)
# for row in datareader:
# print ', '.join(row)
t_y_data = np.loadtxt('exerciseball.csv', dtype=float, delimiter=',', usecols=(1,4), skiprows = 1)
print(t_y_data)
t = t_y_data[:,0]
y = t_y_data[:,1]
gamma0 = [.1]
sigma = [(0.345366)/2]*(len(t))
#len(sigma)
#print(sigma)
#print(len(sigma))
#sigma is the error in our measurements, which is the radius of the object
# Dragfunction is the theoretical equation of the position as a function of time when the thing falling experiences a drag force
# This is the function we are trying to fit to our data
# t is the independent variable time, m is the mass, and D is the Diameter
#Gamma is the value of which python will vary, until chi-squared is a minimum
def Dragfunction(x, gamma):
print x
g = 9.8
D = 0.345366
m = 0.715
# num = math.sqrt(gamma)*D*g*x
# den = math.sqrt(m*g)
# frac = num/den
# print "frac", frac
return ((m)/(gamma*D**2))*math.log(math.cosh(math.sqrt(gamma/m*g)*D*g*t))
optimize.curve_fit(Dragfunction, t, y, gamma0, sigma)
Это сообщение об ошибке я получаю:
return ((m)/(gamma*D**2))*math.log(math.cosh(math.sqrt(gamma/m*g)*D*g*t))
TypeError: only length-1 arrays can be converted to Python scalars
Мой профессор и я провел около трех или четырех часов, пытаясь исправить это. Он помог мне решить много проблем, но это мы, похоже, не можем решить.
Не могли бы вы помочь? Если вам нужна какая-либо другая информация, пожалуйста, дайте мне знать.
Я думаю, вы можете решить это просто с помощью 'np.log' и' np.sqrt' и 'np.cosh', которые действуют только на массивы, а не только на скаляры. – askewchan
Кроме того, не связанный с вашим вопросом, но 'gamma/m * g' совпадает с' gamma * g/m', поскольку умножение и деление выполняется только слева направо в python. Вы хотите «gamma/(m * g)» в соответствии с вашим уравнением сверху. – askewchan
askewchan, поэтому, когда вы говорите, что эти функции действуют на массивы, вы имеете в виду, что он выполняет функцию через каждое значение в массиве? – Mack