#python #scipy-optimize
Вопрос:
Я пытаюсь использовать решение f для набора уравнений:
- xa xb = x
- xa/xb = (CA/CB)e^-(F/RT)*(E0_A-E0_B). Я намерен решить для xa и xb, но сам x представляет собой массив, как показано ниже. Я пытался это сделать, но постоянно получаю сообщение об ошибке. Я не знаю, где я ошибаюсь.
from scipy.optimize import fsolve
import numpy as np
x = np.array([0.01394346, 0.01727623, 0.02139363, 0.02647018, 0.03271463,
0.04037362, 0.04974189, 0.06113669, 0.07489298, 0.0914198 ,
0.11119803, 0.13467519, 0.1622032 , 0.19409497, 0.23056969,
0.27160588, 0.3169306 , 0.36594778, 0.41776317, 0.471372 ,
0.5256699 , 0.5794641 , 0.63155216, 0.68075466, 0.72615373,
0.767264 , 0.80389225, 0.8359975 , 0.8637226 , 0.8873593 ,
0.9072883 , 0.92398256, 0.93792963, 0.9494987 , 0.95898896,
0.96673596, 0.9730703 , 0.9782413 , 0.982436 , 0.9858274 ,
0.9885736 , 0.99079704, 0.9925912 , 0.99403596, 0.99519914,
0.99613607, 0.9968898 , 0.99749595, 0.9979841 , 0.99837816])
def eqs(p):
R = 8.314
F = 96485
T = 298.15
E0_A = 0.516
E0_B = 0.393
CA = 0.37
CB = 0.63
xa, xb = p
return ((xa xb)- x, (xa/xb)-(0.37/0.63)*np.exp(-(96485/(8.314*298.15))*(0.393-0.516)))
eqs((1,1))
fsolve(eqs, x0 = (1,1))
Ошибка значения: установка элемента массива с последовательностью.
Ошибка типа: только массивы размером 1 могут быть преобразованы в скаляры Python
Комментарии:
1. Вы сказали
xa xb=x
, но xa и xb-целые числа. Как этот массив может быть равен 2? Я не понимаю, чего вы здесь ожидаете. Вы пытаетесь сказатьx
, что должно быть одним из значений в этом списке? Кроме того, зачем определять символы, если вы все равно собираетесь встраивать константы?2. Согласно документации: «функция: вызываемая f(x, *args). Функция, которая принимает по крайней мере один (возможно, векторный) аргумент и возвращает значение той же длины.» (где «функция» — ваша
eqs
). Если ваши входные данные представляют собой массив второго размера (не используйте кортеж; сделайте его массивом), результатом должен быть массив второго размера. Но вашеx
значение сделает вывод 2-кортежем (или массивом len-2, если он преобразован) массивов. Что не является эквивалентным по форме входнымp
данным .3. Да, спасибо за ваш комментарий. Я думаю, что здесь я ошибся.