Farest2, спасибо за развернутй ответ.
Интегрирование идет по вертикальной прямой, величина
выбирается такой, чтобы все особые точки
лежали слева. То есть, для
надо выбирать
(забегая вперед, лучше всего брать
, т.к. тогда
).
Насколько я понимаю Вы подставляете
в качестве оператора
и прослеживаете, что бы функция имела область определения. В данном случае сразу возникает вопрос, в любом другой случае (имея случайно взятую передаточную функцию)
нужно то же определять таким образом или можно поступать проще - брать ноль или какое-то малое положительное число?
Кстати, оригинал для этого изображения вы записали неправильно (сами найдите, где ошиблись).
Подозреваю, что я или упростил, поскольку
, или написал знак минуса перед
, а не перед всей дробью, так верно будет? (здесь k это коэффициент передачи)
Если
вещественна при вещественных
, то в сумме можно попарно собрать члены с индексами
и
:
Вот это, а так же на счет упрощения, мне не совсем понятно. Я к сожалению не особо математик, то что понятно математику как "самой собой" для меня может быть не понятным. Но пробую разобраться.
Пользуясь приведенной Вами формулой,
я написал следующий код. По формуле сразу возник вопрос,
, стоящая сразу после фигурной скобки, берется как есть или берется вещественная часть? Иначе ведь все выражение для времени
получается комплексным, а так не должно быть. В коде я взял вещественную часть.
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
Для
и при
получаю следующее:
Код:
laplas = 3.94315672
Проверка = 0.632120550
К сожалению нет совпадения.
Кстати
, если его выбирать разным, все же влияет на результат. При его выборе "в пределах разумных значений" результат отличается не очень сильно, например
Но при дальнейшем увеличении постоянный рост, например при
,
. Поэтому все же не совсем ясно каким его нужно выбирать.
ps. Если не сочтете за труд и если это поможет, то
on-line код, запускается по кнопке Run.