解决立方方程,同情

时间:2015-06-01 11:10:39

标签: python algorithm sympy

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

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

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

事实上,我不知道如何用类方法来定义一个函数... 而这个表达是失败的。

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)。

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

1 个答案:

答案 0 :(得分:0)

你看起来基本上没问题。但是有三点建议:

  1. 确保您的函数始终返回SymPy值,例如因为d可能是一个int,所以不会返回100 * d;返回S(100)*d;
  2. 无论你在哪里进行分工,都要确保它没有遭受Python trunction,其中1/2 - >例如,写B = -S(3)/2*d代替你拥有的内容(并在B的表达式中使用D,在结尾处写(r+B);
  3. 如果存在复杂的根,
  4. max将无法对根进行排序,因此最好手动选择真实的:y=[i for i in solve (x**3+x**2*B+D,x) if i.is_real]