多项式创建

时间:2019-01-02 16:13:45

标签: python polynomial-math

我在python练习中遇到问题,我必须创建一个基于列表的函数,该函数将给我一个特定的多项式方程式,例如,如果给定[1,2,3]生成x^2 + 2x + 3且给定[2,2]生成2x + 2。我的想法是制作一个可一次更改lambda 1项的函数,如下所示,但我无法使其工作。有什么建议吗?

def polynomial(coefs):  
    cofLen = len(coefs)  
    ff = lambda x: 0  
    while cofLen > 0:  
        ff += coefs[0]*( x**cofLen)  
        del coefs[0]  

    return ff  

polynomial([1,2,3])  

我得到的错误是:NameError: global name 'x' is not defined

将其更改为

x = 0
def polynomial(coefs):
    global x  
    cofLen = len(coefs)  
    ff = lambda x: 0  
    while cofLen > 0:  
        ff += coefs[0]*( x**cofLen)  
        del coefs[0]  

    return ff  

将错误更改为TypeError: unsupported operand type(s) for +=: 'function' and 'int'

1 个答案:

答案 0 :(得分:0)

您不能像这样扩展lambda。您在lambda中使用的变量仅存在于其中-这就是为什么您会遇到第一个错误(NameError: global name 'x' is not defined.上的x**cofLen))的原因。如果提供全局x,则仍然无法使用,因为您无法将整数添加到lambda。

您可以使用系数的倒排列表,并enumerate()来获取解决方案,而不是逐步构建lambda。枚举为您提供了进入列表的索引,该索引转换为您需要的x的“幂”。组成函数并计算其中一个x的解决方案:

def pol(coeff,x): 
    """Calculates the resulting tuple for a polynomial given as coeff list
    anc calculates it at one point of x.

    coeff is a list - most significant exponent first:  [1,2,3] == x^2+2x+3 """

    # create a textual representation
    t = []
    for idx,c in enumerate(coeff[::-1]):
        if c != 0:
            if idx == 0:
                t.append(f"{c}")
            else:
                t.insert(0,f"{f'{c}*' if c != 1 else ''}x{'' if idx==1 else f'^{idx}'}")

    # connect text-parts with '+' and fix '+-' to '-'
    text = '+'.join(t).replace("+-","-")

    # calculate the functions value
    result = sum( x**idx*v for idx,v in enumerate(coeff[::-1]))     

    return  text + f"  (@ x={x}) ",result  

for i in range(10):
     print(*pol([3,1,-4,1,0,-10],i),  sep=" ==> ")

输出:

3*x^5+x^4-4*x^3+x^2-10  (@ x=0)  ==> -10
3*x^5+x^4-4*x^3+x^2-10  (@ x=1)  ==> -9
3*x^5+x^4-4*x^3+x^2-10  (@ x=2)  ==> 74
3*x^5+x^4-4*x^3+x^2-10  (@ x=3)  ==> 701
3*x^5+x^4-4*x^3+x^2-10  (@ x=4)  ==> 3078
3*x^5+x^4-4*x^3+x^2-10  (@ x=5)  ==> 9515
3*x^5+x^4-4*x^3+x^2-10  (@ x=6)  ==> 23786
3*x^5+x^4-4*x^3+x^2-10  (@ x=7)  ==> 51489
3*x^5+x^4-4*x^3+x^2-10  (@ x=8)  ==> 100406
3*x^5+x^4-4*x^3+x^2-10  (@ x=9)  ==> 180863

反向枚举如何工作?

enumerate ([3, 1, -4, 1, 0, -10][::-1]) gives us:
# values    -10  0  1 -4  1  3   -> v
# indexes     0  1  2  3  4  5   -> idx

然后sum( x**idx*v for idx,v in enumerate(coeff[::-1]))编辑。

x==5的示例:

c   idx     v
5 ** 0   * -10 =  -10
5 ** 1   *   0 =    0
5 ** 2   *   1 =   25
5 ** 3   *  -4 = -500
5 ** 4   *   1 =  625
5 ** 5   *   3 = 9375   Total sum = 9515