Начнем пожалуй с того, что решать дифференциальные уравнения вручную может быть не совсем просто.

На данном ресурсе http://mathprofi.ru/differencialnye_uravnenija_primery_reshenii.html есть шпоры как это делать вручную, там есть множество подсказок по различным разделам высшей математики, например мне это пригодилось, потому что помнить все и вся не всегда представляется возможным.

Конкретно в данном посте я попытаюсь прорешать 10 примеров из первой темы данного предмета.

Дифференциальные уравнения первого порядка. Примеры решений.Дифференциальные уравнения с разделяющимися переменными

Учитывая что на mathprofi уже есть решения и ответы к этим 10 примерам, я предложу дополнить её решениями данных уравнений с помощью персонального компьютера, а конкретно с помощью языка программирования Python и библиотеки символьного вычисления и решения уравнений SymPy.

Пример 1:

xy'=y

Предложу решить этот пример с помощью 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:

y=Cx

В точности то, что написано в 7 строке вывода.

Пример 2:

y'=-2y,y(0)=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 строки вывода работы скрипта с общим и частным решением на сайте соответственно:

y=Ce^{-2x} ,y=2e^{-2x}

Пример 3:

y'+(2y+1)ctg(x)=0
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)
Ответ сошелся

Ответ:

y=\frac{C}{(2sin^2x)}-\frac{1}{2}

Пример 4:

ylny+xy'=0,y(1)=e

Код:

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))
Ответ сошелся

Ответ:

y=e^{\frac{c}{x}},y=e^{\frac{1}{x}}

Пример 5:

y^{y-x^2}dy-2xdx=0,y(0)=ln2

Код

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))
Ответ сошелся

Ответ:

y=ln(e^{x^2}+C),y=ln(e^{x^2}+1)

Пример 6:

\sqrt{3+y^2}dx+\sqrt{1-x^2}ydy=0

Код:

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))]
Ответ неизвестен правилен ли

Ответ:

y^3+y+x^2+lnx=C

В данном примере 6 на сайте надо было выразить через функцию выше ответ, а код решает сложный диффур и выражает его через зависимую переменную y. Оставим данное уравнение и ответ потомкам.

Пример 7:

2(xy+y)y'+x(y^4+1)=0

Код:

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))))]
Ответ неизвестен правилен ли

Ответ:

arctg(y^2)=-xln|x+1|+C

Данный ответ 7 автор сайта называет общим интегралом и делает проверку дифференцируя этот ответ, а код решает сложный диффур и выражает его через y.

Пример 8:

2y'siny cosy sin^2x+cosx=0,y(PI/2)=0

Код:

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))))]
Ответ неизвестен правилен ли

Ответ:

-0.5cos2y=\frac{1}{sinx}+C, -0.5cos2y=\frac{1}{sinx}-1.5

Данный пример 8 я не смог решить с условием, у кого будут идеи где я ошибся, прошу в комментарии.

Пример 9:

(1+e^x)ydy-e^ydx=0

Код:

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)
Ответ неизвестен правилен ли

Ответ:

e^{-y}(y+1)+x-ln(1+e^x)=C

В 9 примере в ответе опять общий интеграл.

Пример 10:

y-xy'=3(1+x^2y')

Код:

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))
Ответ сошелся

Ответ:

y=\frac{Cx}{(3x+1)}+3

Итог

Очень полезная библиотека этот SymPy - упрощает жизнь и решения сложных дифференциальных уравнений.

Комментарии (12)


  1. Akina
    04.04.2024 19:08
    +4

    Вообще-то диффуры тут решает подключенная библиотека. А питон так, передаёт условие, получает результат, и больше вообще ничего не делает.

    Ни о чём статья. Просто подробный разбор синтаксиса входных данных для библиотеки и интерпретация её результатов, плюс рекомендации по преобразованию исходного уравнения к наиболее приемлемому для формализации виду - было бы гораздо лучше.


    1. Andy_U
      04.04.2024 19:08
      +1

      Вообще-то диффуры тут решает подключенная библиотека.

      которая однако написана на чистом питоне (https://github.com/sympy/sympy)

      А питон так, передаёт условие, получает результат, и больше вообще ничего не делает.

      Так-что второе ваше утверждение неверно.


      1. Akina
        04.04.2024 19:08

        которая однако написана на чистом питоне

        Да, но не автором программ-решателей, опубликованных в статье. Так что у вас получается попытка отдать все лавры создателей библиотеки тому, кто её использует.

        Совпадение языков - это всего лишь случайность.


        1. Andy_U
          04.04.2024 19:08
          +1

          Да, но не автором программ-решателей, опубликованных в статье.

          Я утверждал обратное?

          Так что у вас получается попытка отдать все лавры создателей библиотеки тому, кто её использует.

          Вот нахрена бы мне это было нужно? Я лишь прокомментировал часть вашего сообщения, содержащую неверную информацию. Не более.

          Совпадение языков - это всего лишь случайность.

          И это утверждение тоже мог сделать только человек, котрый про пакет sympy впервые услышал. Я то там еще в 2015 году ошибки находил и пытался pull request сделать.


  1. Gay_Lussak
    04.04.2024 19:08
    +4

    Тю, думал будут численные методы, Рунги-Кутты и т.д. А так любой дурак может вызывать методы в питоне.


  1. belch84
    04.04.2024 19:08

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


    1. haqreu
      04.04.2024 19:08

      Насчёт всех уравнений не знаю, но вот все семьи уравнений встречаются точно. Насколько их необходимо решать символьно - вопрос отдельный.


  1. haqreu
    04.04.2024 19:08
    +1

    Интересно, что функции типа sin и ln набраны италиком, что недопустимо. Надо бы поправить sympy...


  1. Janycz
    04.04.2024 19:08

    "Пример 9: Ответ неизвестен правилен ли". Эхх..., а ведь можно было просто подставить и убедиться в правильности решения.


  1. myswordishatred
    04.04.2024 19:08

    Я уж надеялся почитать статью про численные методы решения дифур и какую-то хитрую реализацию их на питоне. А автор слабал целую статью о том, как он пользуется вызовом методов из подключённой библиотеки.

    Ценность подобного, скажем так, сомнительна.


  1. Kraleks
    04.04.2024 19:08

    если только 2 в С ушла


    1. Akina
      04.04.2024 19:08

      С1 в решении есть С/2 из ответа. Причём результат, полученный программой, вообще-то более корректен, чем эталонный.