2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Вычислить обратное преобразование Лапласа
Сообщение06.01.2020, 07:33 


06/01/20
31
Добрый день.
По ссылке на старнице 13 есть формула (6), численное обратное преобразование Лапласа:

$
f(t)  \approx \dfrac{2e^{at}}{T} \left\langle -\dfrac{1}{2} \operatorname{Re} \overline{F}(a) + \sum\limits_{k=0}^{\infty} \left\lbrace \operatorname{Re} \left\lbrace \overline{F}(a+ik\dfrac{2\pi}{T})\right\rbrace \cos k\dfrac{2\pi}{T}t -  \operatorname{Im} \left\lbrace \overline{F}(a+ik\dfrac{2\pi}{T})\right\rbrace \sin k\dfrac{2\pi}{T}\right\rbrace \right\rangle
$

Пытаюсь решить для момента времени t, написал следующий код:

код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
program inverse_laplace_transform
implicit none

!Объявление переменных
 complex, parameter     :: j = (0,1)            !Комплексная константа
 real, parameter        :: pi=3.1415926         !Число "Пи"
 complex                :: p                    !Комплексная переменная
 complex                :: w                    !Передаточная функция
 real                   :: t                    !Время
 real                   :: tau                  !Постоянная времени
 real                   :: a                    !  ???
 real                   :: T1                   !  ???
 real                   :: k, k_max              
 real                   :: lap1, lap2          
 complex                :: temp, summa, laplas

 !Начальные условия
 a = 1                  ! ???
 T1 = 1                 ! ???
 tau = 0.1              !Постоянная времени звена
 t = 0.1                !Время для которого ищем значение функции оригинала
 summa = 0                     
 k = 0
 k_max = 100000         !Большое число
 
 !Вычисление правой части формулы (суммы)     
   do while (k < k_max)
      p = a + j*k*2*pi/T1
      w = 1.0 / (tau*p + 1.0)                  
      temp = real(w) * cos(k*2*pi*t/T1) - aimag(w) * sin(k*2*pi/T1)
      summa = summa + temp
      k = k + 1
   end do
 
 !Вычисление значения преобразования Лапласа
 lap1 = 2 * exp(a*t)/T1
 p = cmplx(a, 0)
 w = 1.0 / (tau*p + 1.0)
 lap2 = -0.5 * real(w)
 laplas = lap1 * (lap2 + summa)

print*, "laplas = ", laplas
print*, "Проверка = ", 1.0 - exp(-t/tau)

end program inverse_laplace_transform
 


Сверку делаю по передаточной функции апериодического звена

$
W(p) = \dfrac{1}{0.1p+1}
$

для времени $t = 0.1$ с применением формулы

$
f(t) = 1-e^{\frac{-t}{\tau}}
$

где $ \tau$ принимаю равным $0.1$

Получается следующий вывод:

Код:
laplas   =   (1.73351192,0.00000000)
Проверка =   0.632120550   


Результат проверки (по проверочной формуле) соответствует правде, результат обратного преобразования Лапласа нет.

Вопросы:
  1. Что такое постоянная $a$, какой ее нужно принимать численно? Не понимаю что она выражает. На страницах 4-5 того же учебно-методического пособия говорится о коэффициенте $a$, но откуда он находится не указывается.
  2. Что такое постоянная $T$, какой ее нужно принимать численно? То же не понимаю какой она должна приниматься и что выражает. О ней в методическом пособии говорится, что она должна быть мала, кроме того упоминается промежуток $\left\lbrace0...T\right\rbrace$.

При этом если я изменяю коэффициенты $a$ и $T$, то результаты получаются каждый раз разные. Прошу помощи.

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение06.01.2020, 08:10 


26/04/11
90
В синусе $t$ забыли (в правильности формулы не разбирался и PDF не читал).

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение06.01.2020, 11:31 


06/01/20
31
Да, спасибо, действительно просмотрел. Но исправление не помогло.
Заодно переменные temp, summa и laplas переписал в вещественный тип, хотя в данном случае это на результат не влияет.
Теперь программа выдает:
Код:
laplas =    3.67878628   
Проверка =   0.632120550

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение06.01.2020, 12:59 
Заслуженный участник


09/05/12
25179
Можно залезть в оригинальную статью и попробовать взять тесты из нее. Хотя в формуле из методички других опечаток, кроме уже найденной, вроде нет, но...

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение06.01.2020, 18:50 


06/01/20
31
Спасибо, к сожалению на английском, но кое что нашел. На странице 4 приводятся примеры вычисления функций и дается $T=20$. Насколько я понял это граница промежутка времени в пределах которого производится расчет точек функции $f(t)$ (их табличный расчет ведется до $T=20$). При этом указывается что $aT=5$. Пока не понятно откуда такое заключение (они пишут "мы выяснили, что для этого значения хорошо подходит $NSUM=2000$"), но принял это значение, т.е. $a = 5/20 = 0.25$. $NSUM$ принято $2000$ (у меня это k_max). В качестве функций взял их пример с подстановкой тех же самых значений:

$NSUM=2000$

$T=20$

$aT=5$ или $a=\dfrac{5}{20}=0.25$

функция:

$F(p)=p(p+1)^2$ (двойка в степени с минусом, не нашел в LaTeX помощнике как сделать степень)

$f(t) = \dfrac{t}{2}\sin(t)$

Увы, проверочное значение соответствует тому, которое приведено в статье, но само преобразование Лапласа дает другой результат. Очевидно я все же что-то не правильно подставляю в программе, пока не могу понять что.

для $t=1$ я получаю

Код:
laplas =   -6.45467604E-04
Проверка =   0.420735478   


Может быть я что-то неправильно подставляю в передаточную функцию? например вот этот блок

Используется синтаксис Fortran
p = a + j*k*2*pi/T1
w = p*(p+1)**(-2.0)
temp = real(w) * cos(k*2*pi*t/T1) - aimag(w) * sin(k*2*pi*t/T1)
 

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение06.01.2020, 22:33 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
S_WT в сообщении #1433694 писал(а):
двойка в степени с минусом, не нашел в LaTeX помощнике как сделать степень
x^{-y} $x^{-y}$.

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение06.01.2020, 23:16 


26/04/11
90
Трудно что-то посоветовать... Хоть и угадывается в исходной формуле обращение преобразования Лапласа, но в какой-то извращенной форме все записано. Так что, "прилинкованный PDF я не читал, но осуждаю". Лучше всего -- взять Диткин, Прудников "Операционное исчисление" и почитать там про обращение преобразования Лапласа: если $f(t)\Doteq F(p)$, то
$$
f(t)=\frac{1}{2\pi i}\int_{a+i{\mathbb R}} e^{tp}F(p)\,dp.
$$
Интегрирование идет по вертикальной прямой, величина $a$ выбирается такой, чтобы все особые точки $F(p)$ лежали слева. То есть, для $F(p)=1/(0.1p+1)=10/(p+10)$ надо выбирать $a>-10$ (забегая вперед, лучше всего брать $a=0$, т.к. тогда $F(a)=1$). Кстати, оригинал для этого изображения вы записали неправильно (сами найдите, где ошиблись).

Переходим к интегрированию по вещественной оси:
$$
f(t)=\frac{1}{2\pi}\int_{\mathbb R} e^{t(a+ix)}F(a+ix)\,dx
=\frac{e^{at}}{2\pi}\int_{\mathbb R} e^{ixt}F(a+ix)\,dx.
$$
Заменяем интеграл на конечную сумму по Симпсону с шагом $h$ и получаем
$$
f(t)\approx\frac{e^{at}}{2\pi} h\sum_{-K\le k\le K} \exp(ihkt)F(a+ihk).
$$
Судя по записи шага в виде $h=2\pi/T$, кто-то (авторы методички?) хотел задействовать БПФ, я буду использовать $h$ (для краткости).

Если $F(p)$ вещественна при вещественных $p$, то в сумме можно попарно собрать члены с индексами $k$ и $-k$:
$$
f(t)\approx\frac{e^{at}}{2\pi} h\Bigl\{F(a)+2\operatorname{Re}\sum_{1\le k\le K} \exp(ihkt)F(a+ihk)\Bigr\}
$$
и упростить сумму (сами проделайте, никаких сопряжений у $F$ не появится).

Для вашего варианта $F(p)$ ряд при $K=\infty$ легко суммируется аналитически (ТФКП в помощь) к тому, к чему надо, а при $h\to 0$ получается и оригинал.
В общем, берите большое $K$, маленькое $h$ и все у вас получится.

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение07.01.2020, 07:23 


06/01/20
31
Farest2, спасибо за развернутй ответ.

Farest2 в сообщении #1433735 писал(а):
Интегрирование идет по вертикальной прямой, величина $a$ выбирается такой, чтобы все особые точки $F(p)$ лежали слева. То есть, для $F(p)=1/(0.1p+1)=10/(p+10)$ надо выбирать $a>-10$ (забегая вперед, лучше всего брать $a=0$, т.к. тогда $F(a)=1$).

Насколько я понимаю Вы подставляете $a$ в качестве оператора $p$ и прослеживаете, что бы функция имела область определения. В данном случае сразу возникает вопрос, в любом другой случае (имея случайно взятую передаточную функцию) $a$ нужно то же определять таким образом или можно поступать проще - брать ноль или какое-то малое положительное число?

Farest2 в сообщении #1433735 писал(а):
Кстати, оригинал для этого изображения вы записали неправильно (сами найдите, где ошиблись).


Подозреваю, что я или упростил, поскольку $k=1$, или написал знак минуса перед $t$, а не перед всей дробью, так верно будет? (здесь k это коэффициент передачи)

$f(t)=k(1-e^{-\frac{t}{\tau}})$

Farest2 в сообщении #1433735 писал(а):
Если $F(p)$ вещественна при вещественных $p$, то в сумме можно попарно собрать члены с индексами $k$ и $-k$:


Вот это, а так же на счет упрощения, мне не совсем понятно. Я к сожалению не особо математик, то что понятно математику как "самой собой" для меня может быть не понятным. Но пробую разобраться.
Пользуясь приведенной Вами формулой,

$$
f(t)\approx\frac{e^{at}}{2\pi} h\Bigl\{F(a)+2\operatorname{Re}\sum_{1\le k\le K} \exp(ihkt)F(a+ihk)\Bigr\}
$$

я написал следующий код. По формуле сразу возник вопрос, $F(a)$, стоящая сразу после фигурной скобки, берется как есть или берется вещественная часть? Иначе ведь все выражение для времени $t$ получается комплексным, а так не должно быть. В коде я взял вещественную часть.

код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
program inverse_laplace_transform
implicit none

 complex, parameter     :: j = (0,1)                    !Комплексная константа
 real, parameter        :: pi=3.1415926                 !Число "Пи"
 complex                :: p                            !Комплексная переменная
 complex                :: w                            !Передаточная функция
 real                   :: t                            !Время
 real                   :: tau                          !Постоянная времени
 real                   :: a                            !Постоянная
 real                   :: h, k                         !Шаг и переменная k              
 real                   :: laplas
 integer                :: i, k_min, k_max
 complex                :: temp, summa

 !Исходные данные
 t = 0.1
 tau = 0.1
 a = 0
 h = 1e-3
 k_min = 1
 k_max = 100000
 summa = cmplx(0,0)
 
   !Вычисление суммы
   do i = k_min,  k_max
      k = float(i)
      p = a + j*h*k
      w = 1.0 / (tau*p + 1.0)                  
      temp = exp(j*h*k*t) * w
      summa = summa + temp
   end do
 
 !Вычисление обратного преобразования Лапласа
 p = cmplx(a, 0)
 w = 1.0 / (tau*p + 1.0)
 laplas = exp(a*t)/(2.0*pi) * h * (real (w) + 2*real(summa))

!Результат:
print'(a, f8.3)', "laplas = ", laplas
print*, "Проверка = ", 1.0 * (1.0 - exp(-t/tau))

end program inverse_laplace_transform
 


Для $t=0.1$ и при $a=0$ получаю следующее:
Код:
laplas =    3.94315672   
Проверка =   0.632120550 

К сожалению нет совпадения.

Кстати $a$, если его выбирать разным, все же влияет на результат. При его выборе "в пределах разумных значений" результат отличается не очень сильно, например

$a \qquad  laplas $

$-5 \qquad  3.844$

$0 \qquad  3.943$

$1 \qquad  3.969	$

$5 \qquad  4.100$

Но при дальнейшем увеличении постоянный рост, например при $a=25$, $laplas = 6.229$. Поэтому все же не совсем ясно каким его нужно выбирать.
ps. Если не сочтете за труд и если это поможет, то on-line код, запускается по кнопке Run.

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение07.01.2020, 09:18 


26/04/11
90
S_WT в сообщении #1433775 писал(а):
или можно поступать проще - брать ноль или какое-то малое положительное число?

Нет, выбрать одно $a$ на все случаи жизни не получится: для $F(p)=1/(p-2)$ надо выбирать $a>2$, для $F(p)=1/(p-10^6)$ -- больше миллиона, ну а для $F(p)=1/p$ сойдет и "какое-то малое положительное число".

S_WT в сообщении #1433775 писал(а):
Подозреваю, что я или упростил, поскольку $k=1$, или написал знак минуса перед $t$, а не перед всей дробью, так верно будет?

Нет. Вы гадаете. Откройте любой учебник по операционному исчислению (того же Диткина-Прудникова) и прочитайте про оригинал изображения $F(p)=1/(p-c)$. Это минимальный порог для "вхождения" в тему, поэтому ответ я не скажу.

S_WT в сообщении #1433775 писал(а):
По формуле сразу возник вопрос, $F(a)$, стоящая сразу после фигурной скобки, берется как есть или берется вещественная часть?

Плохо дело... Ведь в вашем случае $F(p)=10/(p+10)$, т.е. для вещественных $p$ функция $F(p)$ вещественна. Зачем ей Re навешивать? Берите сразу $F(a)=10/(a+10)$, если хотите программу при разных $a$ погонять.

S_WT в сообщении #1433775 писал(а):
Иначе ведь все выражение для времени $t$ получается комплексным, а так не должно быть.

Все комплексности, которые фигурируют в правой части, съедаются Re, которая стоит перед суммой. В итоге остается только вещественное выражение. Про слагаемое $F(a)$ я уже сказал. Как упростить сумму -- это сами. Ну, ведь знаете же вы, что $\exp(ix)=\cos(x)+i\sin(x)$, или нет? И Re- и Im-части функции $F(a+ihk)=10/(a+ihk+10)$ сами должны найти.

Программу даже смотреть не буду. Пока вы не поймете математику, которую собираетесь перевести в код, нет смысла. А когда поймете, то и я уже буду не нужен. :wink:

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение07.01.2020, 14:40 


06/01/20
31
Я спутал весовую и переходную функции. Все работает.

При $kmax=1000000$ и для $\tau = 0.1$ для переходной функции получились следующие результаты:

Код:
t            laplas      точное знач.   разница по модулю
==========================================================
0.0010      0.0097      0.0100         2.765E-04
0.0100      0.0944      0.0952         7.849E-04
0.0500      0.3932      0.3935         2.234E-04
0.1000      0.6321      0.6321         1.591E-05
0.2000      0.8644      0.8647         2.689E-04
0.3000      0.9503      0.9502         7.004E-05
0.4000      0.9816      0.9817         5.347E-05
0.5000      0.9933      0.9933         4.572E-05
1.0000      0.9999      1.0000         3.988E-05

Можно попробовать поэкспериментировать с уменьшением шага, при расчете приведенных данных он был принят $1e-3$. Зависимость от коэффициента $a$ сильно уменьшилась (возможно потому, что в данном случае производится расчет переходной функции и разброс значений стал менее заметен), однако при больших значениях все равно погрешность возрастает, насколько я понял его нужно выбирать весьма умеренно. Можно и $kmax$ попробовать задрать еще выше.

ps Я это проходил около 30 лет назад и с тех пор понадобилось в первый раз, и то не по работе.

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение08.01.2020, 17:22 


26/04/11
90
Замечательно, что во всем разобрались и все получилось. Что касается
S_WT в сообщении #1433815 писал(а):
при больших значениях все равно погрешность возрастает

то это вполне предсказуемо: $f(t)$ -- хорошая убывающая функция, а ей в формуле множитель $e^{at}$ подсовывают. Ясно, что при больших $a$ и $t$ функция $f(t)$ вынуждена вычисляться как что-то типа $\infty\cdot 0$, что не способствует точности вычислений.

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение08.01.2020, 21:08 
Заблокирован


16/04/18

1129
Работающие обращения пр. Лапласа - это достаточно большая и разработанная область, намного шире, чем указано в методичке, всего пара методов. Если интересно с этим разобраться, то можно начать с обращения чисто действительного в книге Рамма "Многомерные обратные задачи рассеяния". Из другого посмотреть инет и например работы Saito по теме.

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение09.01.2020, 14:04 


06/01/20
31
Farest2 в сообщении #1433979 писал(а):
то это вполне предсказуемо: $f(t)$ -- хорошая убывающая функция, а ей в формуле множитель $e^{at}$ подсовывают. Ясно, что при больших $a$ и $t$ функция $f(t)$ вынуждена вычисляться как что-то типа $\infty\cdot 0$, что не способствует точности вычислений.

Можно включить двойную точность еще. Тем не менее протестировал на примерах из интернета с разными передаточными функциями, графики переходных процессов везде получились полностью идентичными, $kmax$ было установлено 500 000. Любопытно, каким устанавливается этот параметр в других реализациях…

novichok2018 в сообщении #1434036 писал(а):
Работающие обращения пр. Лапласа - это достаточно большая и разработанная область, намного шире, чем указано в методичке,

Я видел в методичке, хотя как Вы говорите там вероятно не все, выбрал наиболее простой способ. Читал, что можно и с помощью преобразования Фурье отыскивать значение оригинала. Какие у него плюсы и минусы?

 Профиль  
                  
 
 Re: Вычислить обратное преобразование Лапласа
Сообщение19.01.2020, 03:39 


06/01/20
31
Провел анализ требуемого максимального $k$ посредством построеня графиков переходных процессов для колебательного звена. Были построены графики при $k=10000$, $50000$, $100000$, $250000$, $500000$ и $1000000$. При $k=10000$ искажения графика очень сильные (вплоть до неузнаваемости), при $k=50000$ искажений много меньше, но они достаточно сильные. При $k=100000$ график принимает практически идеальную форму, но все же есть его незначительные отклонения, при $k=250000$, $500000$ и $1000000$ графики не отличимы друг от друга. Иначе говоря сделан вывод, что достаточно применять $k=250000$. Только для построения некоторых графиков (например имеющих какие-то сильные колебания, выбросы и т.п.) вероятно имеет смысл, на всякий случай, принимать $k$ больший, чем 250000. При построении всех графиков было принято значение $h=0.001$. Вероятно есть смысл попробовать и с меньшим значением $h$.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: TheRuinedMap


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group