10

多項式を関数に解析して導関数を返す方法を象徴的に考えています。多項式を解析するには、どのデータ構造またはメソッドを使用しますか? この質問は技術面接で出てくる可能性があるため、できればライブラリを使用しないでください。

polynomial-> of nth degree

def derivative(polynomial):
    return derivative

Example:

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

私は解決策を望んでいません。これは宿題ではなく、どこから始めればよいかのヒントです。

4

8 に答える 8

17

単一変数の多項式は、係数を含む配列として簡単に表すことができます。したがって、たとえば1 + 5x3-29x5は。として表すことができます[1, 0, 0, 5, 0, -29]。この形式で表現すると、導関数は簡単に計算できます。

poly上記のPythonリストであると仮定します。それで

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

(coefficient, exponent)スパース多項式の場合、ペアのリストや指数を係数にマッピングする辞書など、他の表現は比較的簡単です。

式の解析はより複雑ですが、文法が比較的単純であるため、さまざまな解析フレームワークの使用は簡単です。

于 2012-06-22T12:16:04.273 に答える
5

私の経験では、行列は多項式を表すのに非常に役立つことがよくあります

于 2012-06-22T11:35:26.510 に答える
5

これで思いつきました。あなたが欲しいのはこれです:

  1. 多項式を解析します。定義済みのパターンが必要です。入力が「信頼されていない」または「ワイルド」であるほど、より適切に解析する必要があります。正規表現を使用できます。

  2. 方程式 (coeff, power_of_x) リストの基本コンポーネントを用意します。

  3. 計算してみよう(導関数)

  4. 入力が与えられた方法で方程式を返します。

これにより、以下が得られます。

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「*」が原因で機能しません。もちろんうまくいかない場合も多いのですが、それが基本的な考え方です。

于 2012-06-22T12:08:39.143 に答える
3

さて、出発点は式の基本的なコンポーネントを定義することだと思います。

関数を見てそのように処理したい場合、それは基本的に文法であり、許可する詳細の量によっては少し複雑になる可能性があります。

あなたの文法は表現の形をしています。

EXPRESSIONは、TERM(関数は基本的にnx ^ yのようなものです)またはTERMOPERATOREXPRESSIONのいずれかになります。

このような関数を解析できる場合は、TERMを処理するためのルールを定義してから、残りの式に同じメソッドを再帰的に適用する必要があります。

多項式は常にnx^yの形式になりますが、yが0または1の場合、またはnが1で省略されている場合は、いくつかの簡略化が行われます。

これは、追加のライブラリを使用せずにアプローチする方法です。よろしければ、私のポイントをさらに説明してみてください。

ちなみに、私の答えはPythonや使用するデータ構造に正確に対応しているわけではありませんが、この種の問題に取り組むための1つの可能な方法です。

于 2012-06-22T11:40:39.377 に答える
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 のソリューションの 2 倍以上遅いことが判明しました。この遅さがどこから来たのか誰か説明してくれませんか?

>>> 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]
于 2012-06-22T12:29:21.970 に答える
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)]))
于 2012-06-22T12:07:13.400 に答える
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))          
于 2016-01-23T08:29:42.270 に答える