找到多项式的导数

时间:2012-06-22 11:31:39

标签: python math

我想象一下如何将多项式解析成函数并返回导数。我将使用什么数据结构或解析多项式的方法?最好不要使用任何库,因为这个问题可能会在技术面试中出现。

polynomial-> of nth degree

def derivative(polynomial):
    return derivative

Example:

f(x)  = 2x^2+3x+1
f'(x) = 4x+3

我不想要一个解决方案,这不是作业,而是一个我将从哪里开始的暗示。

8 个答案:

答案 0 :(得分:13)

单个变量中的多项式可以简单地表示为包含系数的数组。因此,例如1 + 5x 3 - 29x 5 可以表示为[1, 0, 0, 5, 0, -29]。以这种形式表示,导数很容易计算。

假设poly是上面的python列表。然后

deriv_poly = [poly[i] * i for i in range(1, len(poly))]

对于稀疏多项式,其他表示相对容易,例如成对列表(coefficient, exponent)或字典映射到系数的指数。

解析表达式更复杂,但使用各种解析框架应该很容易,因为语法相对简单。

答案 1 :(得分:5)

根据我的经验,矩阵在表示多项式时通常非常有用

答案 2 :(得分:5)

我现在想出来了。你想要的是这个:

  1. 解析多项式:您需要有一个预定义的模式。输入越“不可信”或“狂野”,您就越需要解析它。你可以使用正则表达式。

  2. 具有等式(coeff,power_of_x)列表的基本组成部分。

  3. 做数学(衍生公式)

  4. 按照输入的方式返回方程式。

  5. 这会给你:

    import re
    
    def read(eq):
        terms = eq.split('+')
        equation = [re.split('x\^?', t) for t in terms]
        eq_map = []
        for e in equation:
            try:
                coeff = int(e[0])
            except ValueError:
                coeff = 1
            try:
                power = int(e[1])
            except ValueError:
                power = 1
            except IndexError:
                power = 0
            eq_map.append((coeff, power))
        return eq_map
    
    def write(eq_map):
        def str_power(p):
            if p == 0:
                return ''
            elif p == 1:
                return 'x'
            else:
                return 'x^%d' % (p,)
    
        def str_coeff(c):
            return '' if c == 1 else str(c)
        str_terms = [(str_coeff(c) + str_power(p)) for c, p in eq_map]
        return "+".join(str_terms)
    
    def derivative(eq):
        eq_map = read(eq)
        der_map = [(p*c, p-1) for c, p in eq_map[:-1]]
        return write(der_map)
    
    def run(eq):
        print eq, '->', derivative(eq)
    
    run("2x^2+3x+1")
    run("x^3+2x^2+1")
    

    这是非常基本的。例如:2*x^3因“*”而无效。当然,有很多情况下它不起作用,但这是基本的想法。

答案 3 :(得分:3)

嗯,我相信起点是定义表达式的基本组件。

当你看一个函数并希望像这样处理它时,它基本上是一个语法,它可能有点复杂,具体取决于你想要允许多少细节。

您的语法具有表达形式。<​​/ p>

EXPRESSION可以是: TERM(你的函数基本上类似于nx ^ y) 要么 术语表达式

如果你可以解析这样的函数,你只需要定义处理TERM的规则,然后递归地为表达式的其余部分应用相同的方法。

您的多项式将始终具有nx ^ y形式,对于y为0或1的情况进行一些简化,或者当n为1且省略时。

这是我在不使用任何其他库的情况下接近它的方法。如果你愿意,我可以尝试进一步解释我的观点。

顺便说一句,我知道我的答案并不完全适用于Python或要使用的数据结构,但它是解决此类问题的一种可能方式。

答案 4 :(得分:2)

我的解决方案使用迭代,其中第i个元素是x ^ i的系数,因此对于 p(x)= 3 * x ^ 5 + 2 * x ^ 3 + x ^ 2 + 5 输入为[5, 0, 1, 2, 0, 3]。推导符是 p'(x)= 15 * x ^ 4 + 6 * x ^ 2 + 2 * x ,因此预期结果应为[0, 2, 6, 0, 15]

>>> import itertools, operator
>>> coeff = [5, 0, 1, 2, 0, 3]
>>> print list(itertools.imap(operator.mul, itertools.islice(coeff, 1, None), itertools.count(1)))
[0, 2, 6, 0, 15]

更新:我想在这里使用迭代器和所有这些非常棘手,但我的解决方案结果是GregS的两倍多。有人可以从这个缓慢的地方向我解释一下吗?

>>> print timeit.repeat("poly(coeff)", "poly = lambda coeff: [coeff[i] * i for i in range(1, len(coeff))]; coeff = [1, 0, 0, 5, 0, -29]")
[1.7786244418210748, 1.7956598059847046, 1.7500179643792024]
>>> print timeit.repeat("poly(coeff)", "import operator, itertools; poly = lambda coeff: list(itertools.imap(operator.mul, itertools.islice(coeff, 1, None), itertools.count(1))); coeff = [1, 0, 0, 5, 0, -29]")
[4.01759841913463, 4.152715700867423, 5.195021813889031]

答案 5 :(得分:1)

不是一个漂亮或具体的解决方案,但你可以改进:) 使用字典来存储系数及其权力,以权力为关键。

import re
def polynomial(data):
    coeffs = {}
    splits = map(str.strip, re.split(r"([+ \-])",data))
    sign = 1
    for p in splits:
        if p in "+-":
            sign = 1 if p == '+' else -1
            continue
        s = re.split('[^0-9]+', p)
        coeff = int(s[0])
        if len(s) == 1:
            pow = 0
        elif s[1] == '':
            pow = 1
        else:
            pow = int(s[1])
        coeffs[pow] = sign * coeff
    return coeffs

def derive(poly):
    return dict([(p-1, p*c) for p,c in poly.items() if p != 0])

def print_poly(poly, var = 'x'):
    print(''.join(['{0}{1}{2}^{3}'.format('+-'[c<0],c,var,p) for p,c in sorted(poly.items(), reverse = True)]))

答案 6 :(得分:0)

第7行和第8行将提取列表中的系数和指数,而不管符号如何。 第13行和第14行从列表中删除空字符串。 这并不完美,但更简单:

import pdb;                                                                                                                                                                                                                                                                 
import re;                                                                      


poly = input("Input the polynomial you want to find its derivative : ")         

coefficients = re.split("x\^[+-]?[0-9]+",poly)                                  
exponents = re.split("[+-]?[0-9]+x\^",poly)                                     

print(coefficients)                                                            
print(exponents)                                                               

coefficients = [ i for i in coefficients if i !='']                             
exponents = [i for i in exponents if i !='']                                    

print(coefficients)                                                            
print(exponents)                                                               

derivative=""                                                                   
for i in range(len(coefficients)):                                              
    print(coefficients[i])                                                      
    print(exponents[i])                                                         
    coefficient = int(coefficients[i])*int(exponents[i])                        
    exponent = int(exponents[i]) - 1                                            
    if exponent == 0:                                                           
        derivative +=  str(coefficient)                                         
    else:                                                                       
        derivative +=  str(coefficient) + "x^" + str(exponent)                  

print("The original value is {0}".format(poly))                                 
print("The derivative is {0}".format(derivative))          

答案 7 :(得分:0)

如果多项式方程作为列表给出。例如:p = [9,4,12,2] 返回值为[27,8,12]

     def derivative(p):
        derv=[]
        for i in range(len(p)-1):
            derv.append((len(p)-i-1)*p[i])
        return derv