#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!')