【问题标题】:Finding roots of an equation involving a summation using sympy使用 sympy 查找涉及求和的方程的根
【发布时间】:2021-11-18 07:17:01
【问题描述】:

我目前是 sympy 的新手,我正在尝试在 Python 中重现附加图像中的 Mathematica 示例。我的尝试写在下面,但它返回一个空列表

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

【问题讨论】:

  • 在您的问题中,m 只能采用整数值。如果是这样,找到根为17.0652 是什么意思? 17.0652 不是整数。那么,当m 恰好是非整数时,如何解释求和?

标签: python sympy symbolic-math


【解决方案1】:

添加.doit() 来扩大总和似乎有帮助。它为s1 中的总和提供Piecewise((m - 1, Eq(a, 1)), ((a - a**m)/(1 - a), True))/a

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 != 1a == 1

ms 的结果给出了[array(17.06524172), array(nan)],再次以有点尴尬的方式分隔假设的a == 1

【讨论】:

  • 正是 .doit() 是缺少的部分。
猜你喜欢
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多