При поиске производных, как вы используете функцию фильтра, чтобы возвращать только те члены, производные которых не умножаются на ноль, в python 3?

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

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

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)]


person EB Gold    schedule 25.10.2018    source источник
comment
Вы говорите, что функция не работает, но вы не можете выразить, какой результат вы ожидаете или хотите получить в этот момент. Мне непонятны ваши обозначения. Это должно найти f(x-1) с учетом f(x) и производной? Это не то же самое, что найти производную.   -  person Prune    schedule 25.10.2018
comment
Привет Прун, спасибо. Я ожидаю, что это вернет [(6, 1)] . И предполагается найти производную, учитывая уравнение f(x) = три х в квадрате минус одиннадцать. function_terms[1][1]-1 уменьшает степень члена производной на 1.   -  person EB Gold    schedule 25.10.2018
comment
Понятно; пожалуйста, отредактируйте это в своем вопросе: как объяснение, так и ожидаемый результат.   -  person Prune    schedule 25.10.2018
comment
Спасибо за подсказку - готово.   -  person EB Gold    schedule 25.10.2018
comment
Мы все были там. Делайте, что можете (я вижу, что вы приняли ответ) и двигайтесь дальше.   -  person Prune    schedule 25.10.2018


Ответы (3)


Вы можете использовать функцию 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
person ashwani    schedule 25.10.2018
comment
спасибо, я получаю это сообщение об ошибке: TypeError: 'filter' object is not subscriptable . def find_derivative(function_terms): filtered_terms = filter(lambda x: x[1]!=0, function_terms) return (filtered_terms[0][0]*filtered_terms[0][1], filtered_terms[0][1]-1), (filtered_terms[1][0]*filtered_terms[1][1], filtered_terms[1][1]-1) - person EB Gold; 25.10.2018
comment
Если вы используете Python 3, вы должны упомянуть об этом. filter() в python 3 не возвращает список. Вам нужно разыграть его filtered_terms = list(filter(lambda x: x[1]!=0, function_terms)). Также после фильтрации длина списка уменьшается. Таким образом, вы можете получить IndexError. Вы должны изменить свою логику соответственно. Может быть, перебрать каждый кортеж и узнать производные? - person ashwani; 25.10.2018
comment
извините, не упомянул об использовании Python 3! буду делать это отныне! - person EB Gold; 25.10.2018
comment
перебор кортежей сработал! Спасибо!! это окончательный код: - person EB Gold; 25.10.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})
person Yura Beznos    schedule 25.10.2018
comment
Спасибо! это решение может быть немного выше моего уровня, но я проведу небольшое исследование... и хорошо иметь цели/варианты. :) - person EB Gold; 25.10.2018
comment
я пытался проголосовать, но сейчас недостаточно очков репутации, чтобы закрепить это. в любом случае, спасибо еще раз. - person EB Gold; 25.10.2018
comment
@EBGold не волнуйся. Буду рад, если мой совет окажется полезным. :) - person Yura Beznos; 26.10.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)]
person Prune    schedule 25.10.2018
comment
Рад помочь. Голосуйте за те, которые вам нравятся, выбирайте лучшие и продолжайте свою карьеру программиста. - person Prune; 25.10.2018
comment
я пытался проголосовать, но сейчас недостаточно очков репутации, чтобы закрепить это. в любом случае, спасибо еще раз. - person EB Gold; 25.10.2018