Нахождение корней уравнения, включающего суммирование с использованием sympy

#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() был недостающей частью.