Как преобразовать список Python в класс Addy? - PullRequest
1 голос
/ 13 апреля 2020

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

Моя ошибка в объединении и решении частных дифференциалов. Я думаю, что ошибка в выводе решателя.

import sympy as smp

def R1(x):
  return 12*x-x**2

def R2(y):
  return 8*y-y**2

def R3(z):
  return 18*z-3*z**2

def G(L,x,y,z,h):
  return L*(x+y+z-h)


x = smp.Symbol('x')
y = smp.Symbol('y')
z = smp.Symbol('z')
L = smp.Symbol('L')
h = 10

H = smp.lambdify([x,y,z,L], R1(x)+R2(y)+R3(z)+G(L,x,y,z,h))

R1_prime = H(x,y,z,L).diff(x) 
R2_prime = H(x,y,z,L).diff(y) 
R3_prime = H(x,y,z,L).diff(z) 


R1_prime_f = smp.lambdify([x,L],R1_prime) 
R2_prime_f = smp.lambdify([y,L],R2_prime) 
R3_prime_f = smp.lambdify([z,L],R3_prime) 

LM = smp.lambdify(L,(smp.sympify(smp.solve(R1_prime_f(x,L),x))+
                     smp.sympify(smp.solve(R2_prime_f(y,L),y))+
                     smp.sympify(smp.solve(R3_prime_f(z,L),z))-h))

LMN = smp.solve(LM(L),L)

print(LMN) 

Мой вывод

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-81-c72ae9c79af4> in <module>()
     31 LM = smp.lambdify(L,(smp.sympify(smp.solve(R1_prime_f(x,L),x))+
     32                      smp.sympify(smp.solve(R2_prime_f(y,L),y))+
---> 33                      smp.sympify(smp.solve(R3_prime_f(z,L),z))-h))
     34 
     35 LMN = smp.solve(LM(L),L)

TypeError: unsupported operand type(s) for -: 'list' and 'int'

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

solve всегда возвращает список, даже если существует только 1 (или нет) решение. Если вы уверены, что есть только одно решение, вы можете использовать solve(..., x)[0]. Также обратите внимание, что здесь нет необходимости использовать lambdify. Просто используйте выражения напрямую.

Вот как будет выглядеть код без lambdify:

import sympy as smp

def R1(x):
    return 12 * x - x ** 2

def R2(y):
    return 8 * y - y ** 2

def R3(z):
    return 18 * z - 3 * z ** 2

def G(L, x, y, z, h):
    return L * (x + y + z - h)

x = smp.Symbol('x')
y = smp.Symbol('y')
z = smp.Symbol('z')
L = smp.Symbol('L')
h = 10

H = R1(x) + R2(y) + R3(z) + G(L, x, y, z, h)

R1_prime = H.diff(x)
R2_prime = H.diff(y)
R3_prime = H.diff(z)

LM = smp.solve(R1_prime, x)[0] + smp.solve(R2_prime, y)[0] + smp.solve(R3_prime, z)[0] - h

LMN = smp.solve(LM, L)

print(LMN)  # [-18/7]
print(LMN[0].evalf())  # -2.57142857142857

PS: обратите внимание, что в sympy нет необходимости записывать выражения как функции , Все переменные автоматически интерпретируются как параметры функции. В отличие от некоторых других математических сред символов c, в настоящее время sympy не проводит различий между параметрами и переменными символов c.

Поэтому код также можно записать следующим образом.

import sympy as smp

x, y, z, L = smp.symbols('x y z L')
h = 10

R1 = 12 * x - x ** 2
R2 = 8 * y - y ** 2
R3 = 18 * z - 3 * z ** 2
G = L * (x + y + z - h)
H = R1 + R2 + R3 + G

R1_prime = H.diff(x)
R2_prime = H.diff(y)
R3_prime = H.diff(z)

LM = smp.solve(R1_prime, x)[0] + smp.solve(R2_prime, y)[0] + smp.solve(R3_prime, z)[0] - h
LMN = smp.solve(LM, L)
2 голосов
/ 13 апреля 2020

Я не уверен, что я делаю ... но это, кажется, работает

R1_prime_f = smp.lambdify([x,L],R1_prime) 
R2_prime_f = smp.lambdify([y,L],R2_prime) 
R3_prime_f = smp.lambdify([z,L],R3_prime) 

LM = smp.lambdify(L,(smp.sympify(smp.solve(R1_prime_f(x,L),x)[0])+
                     smp.sympify(smp.solve(R2_prime_f(y,L),y)[0])+
                     smp.sympify(smp.solve(R3_prime_f(z,L),z)[0])-h))

LMN = smp.solve(LM(L),L)

print(LMN) 

обратите внимание на индекс 0 здесь smp.sympify(smp.solve(R1_prime_f(x,L),x)[0]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...