Почему я не могу построить что-то, что не является скалярным или одномерным или (2, n) массивом, как? - PullRequest
1 голос
/ 09 января 2020

Я новичок в python, и мне нужно построить графики для моих университетских курсов. Я получаю ошибку значения в этом коде, и я не знаю, как ее решить. Я пытался конвертировать V и m с np.asscalar, но я не получил никаких улучшений.

ValueError: ошибка должна быть скалярной или массивной, как 1D или (2, n)

Я думаю, что проблема в панели ошибок, но я действительно борюсь с этим.

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

m=np.array([np.loadtxt('masse.txt')]) 
sigma_m=np.array([np.loadtxt('errore_masse.txt')])
lati=np.array([np.loadtxt('lati.txt')])
sigma_lati=np.array(np.loadtxt('errore_lati.txt'))
h=np.array([np.loadtxt('altezze.txt')]) 
sigma_h=np.array([np.loadtxt('errore_altezza.txt')])

dc=np.array([6.45, 8.56, 10.45, 10.46])
hc=np.array([16.25, 40.80, 75., 17.67])
lpe=np.array([8.56])
a=np.array([7.41])
hpe=np.array([37.3])
lb=np.array([10.46])

rc=dc/2
Vc=2*np.pi*a**2 *hc
sigma_rc=sigma_lati/2
sigma_Vc=Vc*2*(0.01/dc)

Vpe=6*lpe*a*hpe
sigma_Vpe=((lpe*a)**2 *(0.01)**2 +(lpe*hpe)**2 *(0.01)**2 +(hpe*a)**2 *(0.01)**2)

Vp=lb**2
sigma_Vp=2*Vp*(0.01/lb)

V=np.array([np.loadtxt('volumi.txt')])
sigma_V=np.array([np.loadtxt('errore_volumi.txt')])

def line (x, a, q):
    """funzione retta
    """
    return a*x+q

plt.figure('Grafico massa-volume oggetti di ottone')
plt.errorbar(m, sigma_m, V, sigma_V, marker='.', fmt='.')

popt, pcov=curve_fit(m, V, line)

a_fit, q_fit= popt

sigma_a_fit, sigma_q_fit=np.sqrt(pcov.diagonal())

print(a_fit, q_fit, sigma_a_fit, sigma_q_fit)
x=np.linspace(10.675, 34.080, 10)
plt.plot(x, line(x, a_fit, q_fit))
plt.xlabel('Volume [mm$^3$]')
plt.ylabel('Massa [g]')
plt.grid (ls='dashed', which='both')

plt.show()

1 Ответ

0 голосов
/ 09 января 2020

Ошибка значения, которую вы получаете, заключается в том, что вы перепутали свои значения в панели ошибок. Для использования вы должны проверить документацию .

Ваши проблемы проистекают из этой строки:

plt.errorbar(m, sigma_m, V, sigma_V, marker='.', fmt='.')

Сначала вы должны проверить формы всех этих переменных, используя m.shape, sigma_m.shape, т. Д. Все они должны иметь одинаковую форму, или вторые 2 значения должны быть вашей ошибкой, которую вы переключили. Если они являются многомерными массивами, вам нужно сгладить или использовать индекс, чтобы получить нужный массив. Предполагая, что m - это ваши данные x, а V - ваши данные y, у вас должно быть что-то вроде этого:

plt.errorbar(m, V, xerr=sigma_m, yerr=sigma_V, marker='.', fmt='.')

Поскольку у вас был многомерный массив с использованием (1, N):

plt.errorbar(m[0], V[0], xerr=sigma_m[0], yerr=sigma_V[0], marker='.', fmt='.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...