MAPLE : Проблема решения ОДУ схемы RLC с входной функцией Дирака.

Я пытаюсь решить переходную характеристику базовой схемы RLC (последовательной) с ODE на основе тока i (t) в цепи. Цепь управляется функцией Heaviside(t) (дроссель напряжения равен 1 В), поэтому в ОДУ вторым членом является функция Дирака (diff(Heaviside(t),t).
Как следствие, ОДУ имеет следующий вид (L — индуктивность, R — резистор и C емкость):

L diff(i(t), t, t) + R diff(i(t), t) + i(t)/C = Dirac(t) потому что diff(Heaviside(t), t) = Dirac(t)

Начальные условия следующие: init_cond := D(i)(0) = 1, i(0) = 0.

Значения компонентов: R = 2, L = 1, C = 1/10. Maple возвращает следующее решение:

i := exp(-t)*sin(3*t)/6 + exp(-t)*sin(3*t)*Heaviside(t)/3

Проблема касается первого термина:
exp(-t)*sin(3*t)/6
которого здесь быть не должно. Почему Maple добавляет этот термин? Может я что-то не так сделал?

Когда я решаю это уравнение с помощью Mathematica, я получаю только это: exp(-t)*sin(3*t)*Heaviside(t)/3. Моделирование с помощью LTSPICE дает тот же результат, что и Mathematica. Если я использую Modelica, это то же самое, что Mathematice. Поэтому я думаю, что Maple немного сложнее с Dirac. Я прав?

Заранее спасибо за вашу помощь :)

PS: код, который я использовал, находится здесь:

restart; with(plots); with(plottools);with(DEtools, firint, intfactor, mutest, odeadvisor);
param1 := {C = 1/10, L = 1, R = 2};
RLCi := L*diff(i(t), t, t) + R*diff(i(t), t) + i(t)/C = Dirac(t);
init_cond := D(i)(0) = 1, i(0) = 0;<br />
sol_i_an1 := dsolve(subs(param1, {RLCi, init_cond}), i(t));

person Pascal77    schedule 08.02.2021    source источник


Ответы (2)


Вы даете начальное условие в точке, где решение не определено. Таким образом, решатель должен решить, как интерпретировать условие. Maple, кажется, интерпретирует это как ограничение слева, в то время как другие принимают это как ограничение справа.

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

Таким образом, в целом, если вы форсируете начальное условие с помощью дельты Дирака и форсинга Хевисайда, вам не нужно задавать явные начальные условия. Но прочитайте документацию о том, какие предположения реализуются в этом случае или как кодировать i(t)=0 для t<0.

person Lutz Lehmann    schedule 09.02.2021
comment
Хорошо, большое спасибо за ваш ответ. Я попытаюсь переопределить свои начальные условия. Самому найти было не просто. - person Pascal77; 10.02.2021

restart;

_EnvUseHeavisideAsUnitStep; # not defined

       _EnvUseHeavisideAsUnitStep

Heaviside(0);

                undefined

param1 := {C = 1/10, L = 1, R = 2}:
RLCi := L*diff(i(t), t, t)
        + R*diff(i(t), t) + i(t)/C = Dirac(t):
init_cond := D(i)(0) = 1, i(0) = 0:

dsolve(subs(param1, {RLCi, init_cond}), i(t));

    i(t) = 1/6*exp(-t)*sin(3*t)
           +1/3*exp(-t)*sin(3*t)*Heaviside(t)

_EnvUseHeavisideAsUnitStep:=true:
forget(int); # clear remember table

Heaviside(0);

                   1

dsolve(subs(param1, {RLCi, init_cond}), i(t));

      i(t) = 1/3*exp(-t)*sin(3*t)

[править] Альтернатива для этого примера,

restart;
param1 := {C = 1/10, L = 1, R = 2}:
RLCi := L*diff(i(t), t, t)
        + R*diff(i(t), t) + i(t)/C = Dirac(t):
init_cond := D(i)(0) = 1, i(0) = 0:

Heaviside(0):=1:

dsolve(subs(param1, {RLCi, init_cond}), i(t));

      i(t) = 1/3*exp(-t)*sin(3*t)
person acer    schedule 09.02.2021
comment
Спасибо за ваш ответ. Это работает! Инструкция _EnvUseHeavisideAsUnitStep:=true мне была неизвестна. То же самое было и с функцией «забыть (инт)». Я копаю это. Большое спасибо. - person Pascal77; 10.02.2021
comment
Хорошо. Что касается _EnvUseHeavisideAsUnitStep:=true, я нашел некоторые пояснения на веб-сайте справки Maple. Он переопределяет функцию Хевисайда, чтобы соответствовать моей цели. - person Pascal77; 10.02.2021
comment
Что касается функции «забыть()», я нашел это в Stackoverflow: все вызовы функции «забыть()» в коде предназначены только для того, чтобы попытаться очистить ранее сохраненные результаты. Итак, что такое инт? - person Pascal77; 10.02.2021
comment
Да, на странице справки для команды Heaviside есть некоторая информация. Команда int выполняет интеграцию и вызывается dsolve в вашем примере. Вызов forget предназначен для очистки ранее сохраненного результата int (запоминание), который я сделал, чтобы справиться с тем фактом, что я ранее вызывал dsolve на тех же входных данных, но без установки EnvUseHeavisideAsUnitStep в true. - person acer; 10.02.2021
comment
Отлично. Большое спасибо за ваш информированный ответ :) Просто для информации, эта проблема возникает в других математических программах, таких как MATLAB, в режиме syms, но не с числовыми решателями. - person Pascal77; 10.02.2021
comment
Я не знаю, является ли ваш символический движок для Matlab Maple или (в настоящее время по умолчанию) MuPad. Но вы можете попробовать тот же подход там. Другой способ для Maple - сначала назначить Heaviside(0):=1;, который я добавил в свой ответ. - person acer; 10.02.2021
comment
В программном обеспечении MATLAB он очень похож на MAPLE. Инструкция по изменению определения heaviside следующая: oldparam = sympref('HeavisideAtOrigin',1); Если вы хотите восстановить работу по умолчанию, просто введите: sympref('HeavisideAtOrigin',oldparam); или в конечном итоге: sympref('HeavisideAtOrigin','default'); - person Pascal77; 10.02.2021
comment
Правильно, HeavisideAtOrigin - это путь MuPAD (теперь sym-engine в Matlab). Дайте мне знать, если я могу что-то улучшить в своем ответе, что заслуживает его принятия или одобрения. - person acer; 10.02.2021
comment
Ваш вариант идеален. Он отлично работает, и это очень просто. Больше, чем предыдущее решение. Хотя это не было предметом этой темы, а просто для информации, в MATLAB я попробовал HeavisideAtOrigin, но безуспешно. И команда heaviside(0) = 1 отклоняется. К сожалению, с числовыми решателями, такими как ode45, результаты правильные. Спасибо за помощь. В символическом смысле результаты различаются между dirac(t) и sign(t), но оба неверны. - person Pascal77; 11.02.2021
comment
Жаль, что идеальное решение не заслуживает принятия ответа. - person acer; 18.02.2021