Вычислите значение функции для заданных координат

#python #equation #derivative #taylor-series

Вопрос:

Я здесь новичок. Я хочу написать аккуратную небольшую программу для проверки решений моей подготовки к экзамену, так как мой профессор ничего не предоставил. Для нелинейного дифференциального уравнения f я хочу найти 1 — й полином Тейлора. Поэтому я беру производную от f по каждой переменной. Теперь моя проблема: я должен рассчитать значение каждой производной для определенной заданной точки. Как я могу это сделать для таких сложных выражений, которые просто хранятся в переменной и не известны явно, как они вычисляются?

Это то, что я делаю сейчас, не оценивая:

 f = input('Enter function: ')
fy1 = diff(f,y1)
fy = diff(f,y)
fu2 = diff(f,u2)
fu1 = diff(f,u1)
fu = diff(f,u)
 

Я попробовал эту функцию, так как надеялся, что она автоматически распознает переменные в f:

 def calculate(f,y1,y,u2,u1,u):
    return f

...

fy1 = calculate(diff(f,y1),0,-1,0,0,-4)
fy = calculate(diff(f,y),0,-1,0,0,-4)
fu2 = calculate(diff(f,u2),0,-1,0,0,-4)
fu1 = calculate(diff(f,u1),0,-1,0,0,-4)
fu = calculate(diff(f,u),0,-1,0,0,-4)
 

Редактировать:

Я попробовал кое-что еще: для f= -5 y y1 4*y-u (y1-производная от y) fy1-производная от f по отношению к y1:

 fy1= diff(f, y1)
fy1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
print("{}".format(fy1))
 

Но subs() не заменял никаких значений, так как вывод был следующим:

 -5*y
 

Я предполагаю, что это как-то связано с переменными, определяемыми как символы симпатии?

 y1 = symbols('y1')
y = symbols('y')
u2 = symbols('u2')
u1 = symbols('u1')
u = symbols('u')
 

Но мне это нужно для функции sympy diff()-функции

Комментарии:

1. Я чувствую, что определение проблемы довольно неясно. Может помочь игрушечный (но более полный) пример. Является ли ваше входное выражение/выходной результат числовым? Или ожидалось, что это будет символично?

2. Можете ли вы привести пример для дифференциального уравнения f? Я думаю, что то, что вы ищете, можно сделать с помощью сочувствия

3. хорошо, чтобы обеспечить некоторый контекст: это специфическая часть разработки систем управления. u-входной сигнал (например, нажатие на асселератор), а y-выходной сигнал (например, скорость автомобиля). Для описания такой системы управления мы используем дифференциальные уравнения. Обычно они нелинейны, но в определенный момент (с заданной скоростью) мы можем сказать, что они линейны. Поэтому мы хотим вычислить первый полином Тейлора (или полином Тейлора 1-й степени, я не знаю, как его назвать по-английски), поскольку это линейное приближение. Поэтому я должен вычислить производную уравнения для каждой переменной в указанной точке

4. f = -5*y*y1 4*y-u //y1 является производной от y

Ответ №1:

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

 from sympy import diff, symbols

again = True

while(again):

    y1 = symbols('y1')
    y = symbols('y')
    u2 = symbols('u2')
    u1 = symbols('u1')
    u = symbols('u')
    
    f = input('Enter function: ')
    
    fy1= diff(f, y1)
    res_fy1 = fy1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    print("{}".format(res_fy1))
    
    fy= diff(f, y)
    res_fy = fy.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    fu2= diff(f, u2)
    res_fu2 = fu2.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    fu1= diff(f, u1)
    res_fu1 = fu1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    fu= diff(f, u)
    res_fu = fu.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    print('delta_y2   ('   str(res_fy1)   ')*delta_y1   ('   str(res_fy)   ')*delta_y   ('   str(res_fu2)   ')*delta_u2   ('   str(res_fu1)   ')*delta_u1   ('   str(res_fu)   ')*delta_u')      
    
    wrongInput = True    
    while (wrongInput):
        i = input('Another function? [y/n] ')
    
        if (i == 'n'):
            again = False
            wrongInput = False
    
        elif (i == 'y'):
            wrongInput = False
        
        else:
            print('Wrong Input!')