При поиске производных, как вы используете функцию фильтра, чтобы возвращать только те члены, производные которых не умножены на ноль, в Python 3? - PullRequest
0 голосов
/ 25 октября 2018

Я написал функцию, которая, учитывая члены уравнения, может найти производные.Однако, когда один из членов равен нулю, функция выходит из строя.Как бы я использовал фильтр, чтобы убедиться, что термины, умноженные на ноль, не возвращаются?

Вот мой базовый код, который работает, но еще не включает фильтр:

def find_derivative(function_terms):
    return [(function_terms[0][0]*function_terms[0][1], function_terms[0][1]-1),(function_terms[1][0]*function_terms[1][1], function_terms[1][1]-1)]

function_terms [1] [1] -1 уменьшает мощность члена производной на 1.

Это работает следующим образом.

Вход:

# Represent each polynomial term with a tuple of (coefficient, power)

# f(x) = 4 x^3 - 3 x
four_x_cubed_minus_three_x = [(4, 3), (-3, 1)]
find_derivative(four_x_cubed_minus_three_x)  

Выход:

[(12, 2), (-3, 0)]

Это правильный ответ 12 x^2 - 3

Но здесь он ломается:

Ввод:

# f(x) = 3 x^2 - 11
three_x_squared_minus_eleven = [(3, 2), (-11, 0)]                       
find_derivative(three_x_squared_minus_eleven) 

ЭтоПредполагается найти производную, учитывая уравнение.

Вывод:

((6, 1), (0, -1))

Имеет термин "призрак" 0 * x^(-1);Я не хочу, чтобы этот термин был напечатан.

Ожидаемый результат: [(6, 1)]

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

В python есть символический решатель математики, который называется sympy.Может быть, это может быть полезно для вас.

from sympy import *
x = symbols('x')
init_printing(use_unicode=True)

equation = 4*x**3 -3*x
diff_equation = equation.diff()
solution = diff_equation.subs({x:2})
0 голосов
/ 25 октября 2018

Два изменения:

  1. Сделайте так, чтобы ваша подпрограмма перебирала полиномиальные термины, обрабатывая их по одному, а не зависела от наличия ровно двух терминов.
  2. Примените фильтрацию киндивидуальный термин в том виде, в каком вы его встречаете.

Я расширил это, чтобы также исключить что-либо с нулевым коэффициентом, а также с нулевым показателем.Я добавил тестовый пример с обоими из этих и отрицательным показателем, поскольку теорема о символическом дифференцировании применяется одинаково.

def find_derivative(function_terms):
    return [(term[0]*term[1], term[1]-1)
            for i, term in enumerate(function_terms)
                   if term[0] * term[1] != 0 ]

four_x_cubed_minus_three_x = [(4, 3), (-3, 1)]
print(find_derivative(four_x_cubed_minus_three_x) )

three_x_squared_minus_eleven = [(3, 2), (-11, 0)]
print(find_derivative(three_x_squared_minus_eleven) )

fifth_degree = [(1, 5), (-1, 4), (0, 3), (8, 2), (-16, 0), (1, -2)]
print(find_derivative(fifth_degree) )

Вывод:

[(12, 2), (-3, 0)]
[(6, 1)]
[(5, 4), (-4, 3), (16, 1), (-2, -3)]
0 голосов
/ 25 октября 2018

Вы можете использовать функцию filter() для фильтрации списка кортежей, а затем применить логику к отфильтрованному списку.Нечто подобное должно работать.

filtered_terms = list(filter(lambda x: x[1]!=0, function_terms))

Теперь у вас есть кортежи без констант.Поэтому вместо того, чтобы жестко кодировать производные, попробуйте выполнить цикл по списку, чтобы получить производные.

result = []
for term in filtered_terms:
    result.append((term[0]*term[1], term[1]-1))
return result
...