Поэтому я должен создать программу, которая принимает строку в следующем виде: 2x^3 + x^2 - 4
и вычислим его производную, т.е. сделаем так: 6x^2 + 2x
Поэтому я создаю class Monomial
, который имеет три переменные-члены: коэффициент, имя переменной и мощность. Другими словами, я должен разбить многочлен на одночлены. Затем я должен взять каждый моном и разбить его на вышеупомянутые переменные. Поэтому 2x^3
будет представлен как следующий объект: Monomial(2, 'x', 3)
Тем не менее, как я могу разделить строку, как это конкретно? Я не хочу использовать «SymPy» или другие библиотеки для простого вычисления производных.
3 ответа
Я бы использовал регулярные выражения:
pattern = "(\d+)?([a-z])\^(\d+)"
result = re.match(pattern, "323x^22")
print result.groups()
Производит:
('323', 'x', '22')
Объяснение картины заключается в следующем:
Каждая из скобок будет содержать группу, первая из которых соответствует цифрам, обозначенным «\ d», и соответствует как можно большему числу цифр, обозначенных «+». Знак вопроса указывает на то, что если нет совпадения (потому что это, например, x ^ 2), это нормально. В центральной группе вы видите [a-z], который будет соответствовать любой отдельной строчной букве. Так что, если вы найдете «23c ^ 2», оно также будет соответствовать. Наконец, вам нужно экранировать символ «^», который имеет свое собственное значение в регулярных выражениях, используя вместо него «\ ^».
result = re.match(pattern, "x^2")
print result.groups()
Теперь для ввода «x ^ 2» этот код выдаст:
(None, 'x', '2')
Так что просто замените None на 1.
Сначала я разбил бы исходную строку на мономы и определил элементы каждого монома:
- необязательный знак (по умолчанию +)
- необязательный коэффициент (по умолчанию 1)
- необязательный показатель группы переменных (по умолчанию x ^ 0) - если присутствует только переменная, показатель равен 1
Теперь просто обработать строку с помощью модуля re
:
def process(txt):
monomes = []
for elt in re.findall('([+-]?) *([\d]*)([a-zA-Z]?)(?:\^(\d+))?', txt):
coeff, var, exp = None, None, None
#print(elt)
if elt != ('','','',''):
if elt[1] == '':
coeff = 1
else:
coeff = int(elt[1])
if elt[0] == '-': coeff = - coeff
if elt[3] == '':
if elt[2] == '':
var = 'x'
exp = 0
else:
var = elt[2]
exp = 1
else:
exp = int(elt[3])
var = elt[2]
#print ((coeff, var, exp))
monomes.append(Monome(coeff, var, exp))
return monomes
Теперь получаем:
>>> process(poly)
[Monome(2, 'x', 3), Monome(1, 'x', 2), Monome(-4, 'x', 0)]
Сначала нам нужно разбить выражение на простые биты, но мы должны удалить пробелы в вашей строке.
simplerExpression = " "
expression = input("Expression to derive: ")
for x in range(len(expression)):
if expression[x] != " ":
simplerExpression = simplerExpression + expression[x]
Знайте, что вы знаете, что все, что разделяет каждый моном, - это знак +, поэтому мы разделили все мономы на массив:
ARRMonomial = []
for x in range(len(simplerExpression)):
if simplerExpression[x] != '+':
ARRMonomial.append(monomial)
monomial = 0
else:
monomial = monomial + simplerExpression[x]
То, что вы делаете, это потому, что вы точно знаете, что все, что находится перед символом «x», будет коэффициентом, вы будете перебирать все символы в строке, пока не найдете x, а затем преобразовать их в int (если вам это нужно). Также обратите внимание, что я сделал это только для знака +, а не для отрицательного значения, потому что нам нужно отрицать числа позже с помощью этого цикла:
ARRCoefficients = []
for monomial in ARRMonomial:
sign = 1
pos = 0
coefficient = ""
while monomial[pos] != 'x' and pos <= len(monomial)+1:
if monomial[pos] = '-':
sign = "-1"
else:
coefficient = coefficient + expression[pos]
pos = pos +1
#And if there is no coefficient then return 1
if coefficient == "":
coefficient = 1
ARRcoefficient.append(coefficient)
Знайте, у вас есть способ вывести коэффициент. Что вы делаете, это поиск значения показателей. Вы делаете это циклически, пока не найдете х, а затем используете цифры сразу после «^».
ARRExponents = []
for monomial in ARRMonomial:
Xexists = True
x = 0
while monomial[x] != 'x':
if x == len(monomial):
Xexists = False
break
x = x + 1
if monomial[x+1] == '^' and Xexists == True:
for y in range(x+1,len(monomial)):
exponent = exponent + monomial[y]
elif Xexists == True:
exponent = 1
else:
exponent = 0
ARRExponent.append(exponent)
В итоге вы получите список коэффициентов и показателей степени xs (включая x в степени 0), чтобы вы могли поставить i свою функцию monome. Если вы не знаете, как это сделать:
for x in range(len(ARRExponent)):
monome(ARRCoefficiant[x],'x',ARRExponent[x])
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.