【问题标题】:solve cubic equations ,sympy求解三次方程,sympy
【发布时间】:2015-06-01 11:10:39
【问题描述】:

我有一个项目,其中一个步骤是求解 R(k,d,a), 其中 k 表示第 k 步。

我的朋友建议我在 sympy 中这样做,但我不知道该怎么做。

from sympy import *
k= symbols('k')
d= symbols('d')
a= symbols('a')
R= function('R')(k,d,a)
print R`

其实我不知道怎么用类方法在sympy中定义一个函数... 这个表达式是失败的。

def R(k,d,a):

k:第 n 个进程的#

d:用于初始化的参数

应该给出R(0,d,a)

    if k==0:
       return 100*d
    r=d*(1-(1-(d/R(k-1,d,a))**2)**0.5)**0.5
    B=-3/2*d
    D=(R(k-1,d,a))**3*(3*a*d/R(k-1,d,a)-2)+r**2*(r-3/2*d)

这里我用R(k-1,d,a)定义R(k,d,a),合适吗?

x^3+Bx^2+Cx+D=0 ,其中c=0

这里x代表R(k,d,a)。

    x=symbols('x')
    y=solve (x**3+x**2*B+D,x)
    return max(y)

这里我想要一个 y 的列表,并询问 y 的实数。

稍后返回最大的。

但我不知道如何实现。

最后,对于每个 k ,我需要另一个函数给出一个值,R(k,d,a) 将是其中的一个参数。我想我可以自己用 for 循环来做,它是对我来说并不难。

最难的是如何得到R(k,d,a)。

我不需要复杂的根。但是如果我想要,我怎样才能得到它们? 谢谢收看!

【问题讨论】:

  • 我不知道如何用 sympy 来做,但我创建了一个三次方程求解函数,名为 solve_3

标签: python algorithm sympy


【解决方案1】:

你所拥有的看起来基本没问题。然而,三个建议:

  1. 确保您的函数始终返回 SymPy 值,例如不要返回 100*d,因为 d 可能是一个 int;返回S(100)*d
  2. 无论您在哪里划分,请确保它没有遭受 Python 截断,其中 1/2 -> 0。例如写B = -S(3)/2*d而不是你拥有的(并在你的表达式中使用B来表示D,在它的末尾写(r+B)
  3. 如果存在复根,max 将无法对根进行排序,因此最好手动选择真正的根:y=[i for i in solve (x**3+x**2*B+D,x) if i.is_real]

【讨论】:

  • 我不知道为什么在“R= function('R')(k,d,a)”处出现错误。它说 TypeError: 'module' object is not callable 即使我写了 R= function('R')。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多