проблема типа печати: TypeError: только массивы размера 1 могут быть преобразованы в Python скаляры - PullRequest
1 голос
/ 02 февраля 2020

Я переписываю астрофизическую статью на python (статья не определила x и y, поэтому на данный момент я установил их на ноль). Но у меня возникают проблемы при построении с ошибкой:

TypeError: только массивы размера 1 могут быть преобразованы в Python скаляры

обратите внимание, что если я поставлю plt.plot(R,Vd) выдает ошибку:

Ошибка значения: x и y должны иметь одинаковое первое измерение, но иметь формы (100,) и (1,)

import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
import scipy.integrate as integrate
from scipy.integrate import dblquad
from scipy.special import ellipe
from scipy.special import ellipk

#constants
G = 4.300e-6    #gravitational constant (kpc/solar mass*(km/s)^2)
Edc = 8.44e2      #central value, solar_m / pc^2
Rd = 3.5     #scale radius, kpc

r = np.linspace(0,100,100)
Ed = lambda r: Edc*np.exp(-r/Rd)     #surface mass density
R = np.linspace(0,100,100)     #radius,kpc
x = 0     #radius,kpc
y = 0     #radius,kpc

s = np.sqrt((R-x)**2+y**2)   #distance between mass element and point

def f(x, y):
    return Ed(r)*(R-x)/s**3
F= lambda R:G*dblquad(f, -np.inf, np.inf, -np.inf, np.inf)
Vd = lambda R: np.sqrt(R*F(R))

fig = plt.figure(figsize=(9.0,8.0))                #size of the plot
ax = plt.axes()
ax.grid(True)
ax.yaxis.grid(True,which='minor',linestyle='--')
plt.plot(R,Vd(R)) 

1 Ответ

1 голос
/ 02 февраля 2020

Ниже будет объяснена причина ошибки и способы ее устранения, но я бы рекомендовал либо добавить более подробную информацию к вопросу о том, что вы пытаетесь совершить sh, либо открыть новый вопрос с помощью физики и , чтобы помочь вам реорганизовать код для удовлетворения требований, изложенных ниже.


Ошибка возникает из-за того, что аргумент func в scipy.integrate.dblquad должен иметь подпись

func(y, x) -> scalar

Не

func(x, y) -> np.ndarray

Таким образом, вы не можете вернуть массив из f(x, y). Если вы сделаете

def f(y, x):
    return (Ed(r[0]) * R[0] - x) / s[0]**3

Вы не получите эту ошибку. Однако вы также не получите желаемый результат, поскольку f(y, x) применяется только к одному радиусу и расстоянию. Чтобы получить желаемый результат, вам необходимо провести рефакторинг своего кода, чтобы удовлетворить требование, согласно которому f(y, x) имеет подпись вызова, в которой он возвращает одно значение с плавающей точкой.

Существует еще одна проблема с кодом, scipy.integrate.dblquad возвращает два значения: ошибку и результирующий интеграл - при условии, что вы пытаетесь использовать результирующий интеграл, а не ошибку, которую вам нужно сделать

F = lambda R: G*dblquad(f, -np.inf, np.inf, -np.inf, np.inf)[0]
...