Python "ValueError: установка элемента массива с последовательностью." Я не вижу, какая часть не работает - PullRequest
1 голос
/ 12 февраля 2020

Цель следующего кода - подключить функцию "ddW" к odeint, чтобы найти W для заданного X (позже). Я использую функцию печати, чтобы убедиться, что функции выполняются).

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
import pint
u = pint.UnitRegistry()

R = 8.31446261815324  * u.J/(u.mol*u.K)
Rgas = R.to            (u.atm*u.L/(u.mol*u.K))

P0  = 10    * u.atm
T   = 400   * u.K
v0  = 2     * u.L/u.min
α   = 0.02  * u.kg**-1

k   = 1.4   * u.L**2/(u.mol*u.kg*u.min)

FA0 = 0.5*P0*v0/(Rgas*T) #Assuming I.G.

def ddW(param,w):                               #param: [X,P]
    X       = param[0]
    P       = u.Quantity(param[1]).magnitude    * u.atm
    W       = u.Quantity(w).magnitude           * u.kg

    d       = np.zeros(2)
    d[0]    = k*FA0/(v0**2*P0)  * P*W*(1-X)     #dX/dW
    d[1]    = -α/2 *P0**2       * (1-X)/P       #dP/dW
    return d

param0 = [0,P0]
Wrange = np.linspace(0,100) *u.kg

#PBR     = odeint(ddW,param0,Wrange)


#plt.plot(Wrange,PBR)

print(ddW(param0,0))
Traceback (most recent call last):

  File "<ipython-input-1-83022bc3b5da>", line 1, in <module>
    runfile(REDACTED, wdir=REDACTED)

  File "C:\Users\Spencer\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\Spencer\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "REDACTED", line 43, in <module>
    print(ddW(param0,0))

  File "REDACTED", line 33, in ddW
    d[1]    = -α/2 *P0**2       * (1-X)/P       #dP/dW

ValueError: setting an array element with a sequence.

Ранее у меня было то же сообщение об ошибке для строки 32 (определяющей d [0]), пока я не определил W в строке 29. Меня беспокоит то, что ни один из входов для d [1] (насколько я могу судить) не имеет размера> 1, поэтому он должен соответствовать.

Ответы [ 2 ]

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

Используйте следующее для создания массива. Создаваемый вами массив имеет тип float, а значения, которые вы получаете в d [0] и d [1], не являются float.

d = np.array(np.zeros(2), dtype=np.object)
0 голосов
/ 12 февраля 2020

Предполагая, что ваше исправление для строки 32 (определение d [0]) должно было заменить w на W, где вы взяли величину w, вам нужно сделать то же самое для количества, которое вы пытаетесь поместить в д [1].

Правая сторона = для строки 32 является безразмерным Quantity объектом, тогда как правая сторона = для строки 33 является Quantity объектом с размером standard_atmosphere / kilogram, который не может быть помещенным в массив d как есть, потому что он должен быть только величиной, чтобы его можно было преобразовать в тип float.

Попробуйте, если вы хотите сохранить свой массив d как тип float:

val     = -a/2 *P0**2       * (1-X)/P       #dP/dW
d[1]    = val.magnitude
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...