Полиномиальное создание - PullRequest
0 голосов
/ 02 января 2019

У меня проблемы с упражнением на python, я должен создать функцию, которая на основе списка даст мне определенное полиномиальное уравнение, например, если дано [1,2,3] генерирует x^2 + 2x + 3, а если дано [2,2] генерирует 2x + 2. Моя идея состояла в том, чтобы создать функцию, которая изменяет лямбда-член 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 голосов
/ 02 января 2019

Вы не можете продлить лямбду, как это. Переменная, которую вы используете внутри лямбды, существует только в ней, поэтому вы получаете первую ошибку (NameError: global name 'x' is not defined. на x**cofLen)). Если вы предоставите глобальный 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])) -ed.

Пример для 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
...