Я пытаюсь решить дифференциальные уравнения с неопределенными формами, и я играю с пакетом Julia и DifferentialEquations.jl, чтобы сделать это.
Я начал с простого дифференциального уравнения неопределенной формы, которое я знаю (как тестовый пример), чтобы посмотреть, может ли это сработать (Моя конечная цель - решить сложную систему дифференциальных уравнений и соединить ее с машиной Обучение. Это требует значительных усилий с моей стороны для анализа и кодирования, что я хотел бы начать, только когда узнаю, что некоторые базовые c тестовые случаи работают).
Вот код тестового примера, с которого я начал:
bondi(u,p,t) = -(2*k/t^2)*(1 - (2*a^2*t/k))/(1 - a^2/u)
u0 = 0.01
p = (1e4, 10)
k,a = p
tc = k/(2*a^2)
tspan = (tc/10, tc*5)
prob = ODEProblem(bondi,u0,tspan,p)
Аналитическое решение этой проблемы (известное как проблема потока Бонди в астрофизике) хорошо известно (даже для неопределенных случаев). ). Я заинтересован в неопределенных решениях, полученных из решателя.
Когда я решаю с помощью sol = solve(prob)
, я получаю колеблющееся решение, весьма отличающееся от гладкого аналитического решения, которое, как я знаю, существует (см. Рисунок в ссылке ниже ).
График u против t
Я ожидал встретить некоторые «проблемы», когда t приближается к 50 (в то время как переменная оси y (представляющая скорость), обозначенная u, будет подход 100), поскольку только тогда числитель (и знаменатель) будут вместе sh. Любые идеи, почему решения начинают колебаться?
Я также попытался с sol = solve(prob, alg_hints = [:stiff])
и получил следующее предупреждение:
Предупреждение: прервано. Нужны большие макситеры. @ DiffEqBase C: \ Users \ User.julia \ packages \ DiffEqBase \ 1yTcS \ src \ integrator_interface.jl: 329
Решение все еще колеблется (аналогично решениям, полученным без наложения жесткости).
Я что-то здесь не так делаю? Есть ли другой способ решения таких неопределенных уравнений с помощью пакета DifferentialEquations.jl?