Поэтому я должен создать программу, которая принимает строку в следующем виде: 2x^3 + x^2 - 4 и вычислим его производную, т.е. сделаем так: 6x^2 + 2x

Поэтому я создаю class Monomial, который имеет три переменные-члены: коэффициент, имя переменной и мощность. Другими словами, я должен разбить многочлен на одночлены. Затем я должен взять каждый моном и разбить его на вышеупомянутые переменные. Поэтому 2x^3 будет представлен как следующий объект: Monomial(2, 'x', 3)

Тем не менее, как я могу разделить строку, как это конкретно? Я не хочу использовать «SymPy» или другие библиотеки для простого вычисления производных.

3
Boyan Kushlev 14 Дек 2015 в 18:09

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.

5
Jblasco 14 Дек 2015 в 16:32

Сначала я разбил бы исходную строку на мономы и определил элементы каждого монома:

  • необязательный знак (по умолчанию +)
  • необязательный коэффициент (по умолчанию 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)]
0
Serge Ballesta 14 Дек 2015 в 16:03

Сначала нам нужно разбить выражение на простые биты, но мы должны удалить пробелы в вашей строке.

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])
1
Ziad Fakhoury 14 Дек 2015 в 15:59