Начнем пожалуй с того, что решать дифференциальные уравнения вручную может быть не совсем просто.
На данном ресурсе http://mathprofi.ru/differencialnye_uravnenija_primery_reshenii.html есть шпоры как это делать вручную, там есть множество подсказок по различным разделам высшей математики, например мне это пригодилось, потому что помнить все и вся не всегда представляется возможным.
Конкретно в данном посте я попытаюсь прорешать 10 примеров из первой темы данного предмета.
Дифференциальные уравнения первого порядка. Примеры решений.Дифференциальные уравнения с разделяющимися переменными
Учитывая что на mathprofi уже есть решения и ответы к этим 10 примерам, я предложу дополнить её решениями данных уравнений с помощью персонального компьютера, а конкретно с помощью языка программирования Python и библиотеки символьного вычисления и решения уравнений SymPy.
Пример 1:
Предложу решить этот пример с помощью Python
import sympy
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 1")
x = sympy.symbols('x')#Независимая переменная
y = sympy.Function('y')#Зависимая переменная
equation = sympy.Eq(x*y(x).diff(x), y(x))#Условие задачи выражение
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)#Метод решения диф. уравнения
print("Общее решение:")
print(solution)
print("Ответ сошелся")
print("-----------------------------------------------------------------")
Результатом работы данного скрипта будет такой вывод:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 1
Условие:
Eq(x*Derivative(y(x), x), y(x))
Общее решение:
Eq(y(x), C1*x)
Ответ сошелся
Смотрим ответ на mathprofi:
В точности то, что написано в 7 строке вывода.
Пример 2:
Это задача с условием, поэтому код немного усложнится.
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 2")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq(y(x).diff(x), -2*y(x))
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
C1=sympy.solve(solution.subs(x,0).subs(y(0),2),'C1')[0]#Подставляем условия
z=solution.subs('C1',C1)
print("Частное решение:")
print(z)
print("Ответ сошелся")
Смотрим вывод работы скрипта:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 2
Условие:
Eq(Derivative(y(x), x), -2*y(x))
Общее решение:
Eq(y(x), C1*exp(-2*x))
Частное решение:
Eq(y(x), 2*exp(-2*x))
Ответ сошелся
Сравним 7 и 9 строки вывода работы скрипта с общим и частным решением на сайте соответственно:
Пример 3:
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 3")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq(y(x).diff(x)+(2*y(x)+1)*sympy.cot(x),0)
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
print("Ответ сошелся")
Выхлоп:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 3
Условие:
Eq((2*y(x) + 1)*cot(x) + Derivative(y(x), x), 0)
Общее решение:
Eq(y(x), C1/sin(x)**2 - 1/2)
Ответ сошелся
Ответ:
Пример 4:
Код:
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 4")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq(y(x)*sympy.ln(y(x))+x*y(x).diff(x),0)
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
C1=sympy.solve(solution.subs(x,1).subs(y(1),sympy.exp(1)),'C1')[0]
z=solution.subs('C1',C1)
print("Частное решение:")
print(z)
print("Ответ сошелся")
Выхлоп:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 4
Условие:
Eq(x*Derivative(y(x), x) + y(x)*log(y(x)), 0)
Общее решение:
Eq(y(x), exp(C1/x))
Частное решение:
Eq(y(x), exp(1/x))
Ответ сошелся
Ответ:
Пример 5:
Код
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 5")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq(y(x).diff(x)*sympy.exp(y(x)-x*x)-2*x,0)
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
C1=sympy.solve(solution.subs(x,0).subs(y(0),sympy.ln(2)),'C1')[0]
z=solution.subs('C1',C1)
print("Частное решение:")
print(z)
print("Ответ сошелся")
Выхлоп:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 5
Условие:
Eq(-2*x + exp(-x**2 + y(x))*Derivative(y(x), x), 0)
Общее решение:
Eq(y(x), log(C1 + exp(x**2)))
Частное решение:
Eq(y(x), log(exp(x**2) + 1))
Ответ сошелся
Ответ:
Пример 6:
Код:
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 6")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq((y(x).diff(x))*y(x)*sympy.sqrt(1-x*x)-sympy.sqrt(3+y(x)*y(x)),0)
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
print("Ответ неизвестен правилен ли")
Выхлоп:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 6
Условие:
Eq(sqrt(1 - x**2)*y(x)*Derivative(y(x), x) - sqrt(y(x)**2 + 3), 0)
Общее решение:
[Eq(y(x), -sqrt(C1**2 + 2*C1*asin(x) + asin(x)**2 - 3)), Eq(y(x), sqrt(C1**2 + 2*C1*asin(x) + asin(x)**2 - 3))]
Ответ неизвестен правилен ли
Ответ:
В данном примере 6 на сайте надо было выразить через функцию выше ответ, а код решает сложный диффур и выражает его через зависимую переменную y. Оставим данное уравнение и ответ потомкам.
Пример 7:
Код:
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 7")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq((y(x).diff(x))*2*(y(x)*x+y(x))+x*(y(x)**4+1),0)
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
print("Ответ неизвестен правилен ли")
Выхлоп:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 7
Условие:
Eq(x*(y(x)**4 + 1) + 2*(x*y(x) + y(x))*Derivative(y(x), x), 0)
Общее решение:
[Eq(y(x), -sqrt(tan(C1 - x + log(x + 1)))), Eq(y(x), sqrt(tan(C1 - x + log(x + 1))))]
Ответ неизвестен правилен ли
Ответ:
Данный ответ 7 автор сайта называет общим интегралом и делает проверку дифференцируя этот ответ, а код решает сложный диффур и выражает его через y.
Пример 8:
Код:
print("#Дифференциальные уравнения первого порядка.")
print("#Дифференциальные уравнения с разделяющимися переменными")
print("#Пример 8")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq(2*y(x).diff(x)*sympy.sin(y(x))*sympy.cos(y(x))*sympy.sin(x)**2+sympy.cos(x),0)
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
print("Ответ неизвестен правилен ли")
for sol in solution:
C1=sympy.solve(sol.subs(x,sympy.pi*0.5).subs(y(sympy.pi*0.5),0),'C1')
if C1==[] or C1==[-1]:
continue
z=sol.subs('C1',C1)
print("Частное решение:")
print(z)
Выхлоп:
#Дифференциальные уравнения первого порядка.
#Дифференциальные уравнения с разделяющимися переменными
#Пример 8
Условие:
Eq(2*sin(x)**2*sin(y(x))*cos(y(x))*Derivative(y(x), x) + cos(x), 0)
Общее решение:
[Eq(y(x), pi - asin(sqrt(C1 + 1/sin(x)))), Eq(y(x), asin(sqrt(C1 + 1/sin(x))) + pi), Eq(y(x), -asin(sqrt(C1 + 1/sin(x)))), Eq(y(x), asin(sqrt(C1 + 1/sin(x))))]
Ответ неизвестен правилен ли
Ответ:
Данный пример 8 я не смог решить с условием, у кого будут идеи где я ошибся, прошу в комментарии.
Пример 9:
Код:
print("# Дифференциальные уравнения первого порядка.")
print("# Дифференциальные уравнения с разделяющимися переменными")
print("# Пример 9")
x = sympy.symbols('x')
y = sympy.Function('y')
equation = sympy.Eq(y(x).diff(x) * y(x) *(1+sympy.exp(x)) - sympy.exp(y(x)), 0)
print("Условие:")
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
print("Ответ неизвестен правилен ли")
Выхлоп:
# Дифференциальные уравнения первого порядка.
# Дифференциальные уравнения с разделяющимися переменными
# Пример 9
Условие:
Eq((exp(x) + 1)*y(x)*Derivative(y(x), x) - exp(y(x)), 0)
Общее решение:
Eq(y(x), -LambertW(C1 + x*exp(-1) - exp(-1)*log(exp(x) + 1)) - 1)
Ответ неизвестен правилен ли
Ответ:
В 9 примере в ответе опять общий интеграл.
Пример 10:
Код:
print("# Дифференциальные уравнения первого порядка.")
print("# Дифференциальные уравнения с разделяющимися переменными")
print("# Пример 10")
x = sympy.symbols('x')
y = sympy.Function('y')
print("Условие:")
equation = sympy.Eq(y(x).diff(x) * (x+3*x*x) -y(x)+3, 0)
print(equation)
solution = sympy.dsolve(equation)
print("Общее решение:")
print(solution)
print("Ответ сошелся")
Выхлоп:
# Дифференциальные уравнения первого порядка.
# Дифференциальные уравнения с разделяющимися переменными
# Пример 10
Условие:
Eq((3*x**2 + x)*Derivative(y(x), x) - y(x) + 3, 0)
Общее решение:
Eq(y(x), 3*(C1*x + 3*x + 1)/(3*x + 1))
Ответ сошелся
Ответ:
Итог
Очень полезная библиотека этот SymPy - упрощает жизнь и решения сложных дифференциальных уравнений.
Комментарии (12)
Gay_Lussak
04.04.2024 19:08+4Тю, думал будут численные методы, Рунги-Кутты и т.д. А так любой дурак может вызывать методы в питоне.
belch84
04.04.2024 19:08Мне всегда было интересно, все ли дифференциальные уравнения, которые есть в известном задачнике Филиппова, встречаются в реальной жизни. Впечатление такое, что подавляющее их большинство сконструировано искусственно, чтобы научить студентов разделению переменных, замене переменной и прочему. Именно поэтому решать такие уравнения с помощью какой-либо системы символьных преобразований несколько бессмысленно, они нужны по большей части для обучения человека
haqreu
04.04.2024 19:08Насчёт всех уравнений не знаю, но вот все семьи уравнений встречаются точно. Насколько их необходимо решать символьно - вопрос отдельный.
haqreu
04.04.2024 19:08+1Интересно, что функции типа sin и ln набраны италиком, что недопустимо. Надо бы поправить sympy...
Janycz
04.04.2024 19:08"Пример 9: Ответ неизвестен правилен ли". Эхх..., а ведь можно было просто подставить и убедиться в правильности решения.
myswordishatred
04.04.2024 19:08Я уж надеялся почитать статью про численные методы решения дифур и какую-то хитрую реализацию их на питоне. А автор слабал целую статью о том, как он пользуется вызовом методов из подключённой библиотеки.
Ценность подобного, скажем так, сомнительна.
Akina
Вообще-то диффуры тут решает подключенная библиотека. А питон так, передаёт условие, получает результат, и больше вообще ничего не делает.
Ни о чём статья. Просто подробный разбор синтаксиса входных данных для библиотеки и интерпретация её результатов, плюс рекомендации по преобразованию исходного уравнения к наиболее приемлемому для формализации виду - было бы гораздо лучше.
Andy_U
которая однако написана на чистом питоне (https://github.com/sympy/sympy)
Так-что второе ваше утверждение неверно.
Akina
Да, но не автором программ-решателей, опубликованных в статье. Так что у вас получается попытка отдать все лавры создателей библиотеки тому, кто её использует.
Совпадение языков - это всего лишь случайность.
Andy_U
Я утверждал обратное?
Вот нахрена бы мне это было нужно? Я лишь прокомментировал часть вашего сообщения, содержащую неверную информацию. Не более.
И это утверждение тоже мог сделать только человек, котрый про пакет sympy впервые услышал. Я то там еще в 2015 году ошибки находил и пытался pull request сделать.