#python #sympy #symbolic-math
Вопрос:
В настоящее время я новичок в sympy и пытаюсь воспроизвести пример Mathematica на прилагаемом изображении на Python. Моя попытка описана ниже, но она возвращает пустой список
import sympy m , n, D_star, a, j = sympy.symbols('m , n, D_star, a, j') s1 = sympy.Sum(a**(j-1),(j, 1, m-1)) rhs = 6 * sympy.sqrt((D_star * (1 a)*(n - 1))/2) expand_expr = sympy.solve(s1 - rhs, m) temp = sympy.lambdify((a, n, D_star), expand_expr, 'numpy') n = 100 a = 1.2 D_star = 2.0 ms = temp(1.2, 100, 2.0) ms # what I get is an empty list [] # expected answer using Mma FindRoot function is 17.0652
Комментарии:
1. В вашей задаче
m
можно принимать только целочисленные значения. Если да, то что вы подразумеваете под поиском корня17.0652
?17.0652
не является целым числом. Итак, как интерпретировать суммирование, когдаm
оно оказывается нецелым числом?
Ответ №1:
Добавление .doit()
, чтобы увеличить сумму, кажется, помогает. Это дает Piecewise((m - 1, Eq(a, 1)), ((a - a**m)/(1 - a), True))/a
за сумму в s1
.
from sympy import symbols, Eq, Sum, sqrt, solve, lambdify m, n, j, a, D_star = symbols('m n j a D_star') s1 = Sum(a**(j - 1), (j, 1, m - 1)).doit() rhs = 6 * sqrt((D_star * (1 a) * (n - 1)) / 2) expand_expr = solve(Eq(s1, rhs), m) temp = lambdify((a, n, D_star), expand_expr, 'numpy') n = 100 a = 1.2 D_star = 2.0 ms = temp(1.2, 100, 2.0)
Это дает для expand_expr
:
[Piecewise((log(a*(3*sqrt(2)*a*sqrt(D_star*(a*n - a n - 1)) - 3*sqrt(2)*sqrt(D_star*(a*n - a n - 1)) 1))/log(a), Ne(a, 1)), (nan, True)), Piecewise((3*sqrt(2)*a*sqrt(D_star*(a*n - a n - 1)) 1, Eq(a, 1)), (nan, True))]
которая разделяется на a != 1
и a == 1
.
Результат ms
дает [array(17.06524172), array(nan)]
, опять же, немного неловкий способ отделить гипотетическое a == 1
.
Комментарии:
1. Именно .doit() был недостающей частью.