Доброго времени суток, уважаемые форумчане!
Пусть дана обратная задача нахождения функции
![$h(t)$ $h(t)$](https://dxdy-02.korotkov.co.uk/f/5/d/b/5db6a630447f3e1510ef30b4769ee0aa82.png)
по имеющимся значениям
![$f(t)$ $f(t)$](https://dxdy-03.korotkov.co.uk/f/2/7/0/27099e26220f898359382d05f75b941c82.png)
![$$
\frac{\partial u_1(x,t)}{\partial
t}=a_1^2\frac{\partial^{2}v_1(x,t)}{\partial x^2},\ \ 0<x<x_0,\ \ t>0,
$$ $$
\frac{\partial u_1(x,t)}{\partial
t}=a_1^2\frac{\partial^{2}v_1(x,t)}{\partial x^2},\ \ 0<x<x_0,\ \ t>0,
$$](https://dxdy-01.korotkov.co.uk/f/c/a/a/caaa11a8c5c178cac1e680e17cce487e82.png)
![$$
\frac{\partial u_2(x,t)}{\partial
t}=a_2^2\frac{\partial^{2}u_2(x,t)}{\partial x^2},\ x_0<x<1,\ \ t>0,\ \ a_1,\ a_2>0,
$$ $$
\frac{\partial u_2(x,t)}{\partial
t}=a_2^2\frac{\partial^{2}u_2(x,t)}{\partial x^2},\ x_0<x<1,\ \ t>0,\ \ a_1,\ a_2>0,
$$](https://dxdy-01.korotkov.co.uk/f/8/5/9/859fdd5d062710987c58e13da158f81c82.png)
![$$
u_1(x,0)=0, \ \ x\in[0,x_0];\qquad u_2(x,0)=0,\ \ x\in \left( \right. x_0,1 \left. \right],
$$ $$
u_1(x,0)=0, \ \ x\in[0,x_0];\qquad u_2(x,0)=0,\ \ x\in \left( \right. x_0,1 \left. \right],
$$](https://dxdy-04.korotkov.co.uk/f/f/d/e/fde2d37ca0f0cbba354445ef1bc5710a82.png)
![$$
u_1(0,t)=h(t),\ \ t\geq 0,
$$ $$
u_1(0,t)=h(t),\ \ t\geq 0,
$$](https://dxdy-02.korotkov.co.uk/f/9/c/6/9c61febcf62564321010491e352619eb82.png)
![$$
u_2(1,t)=0,\ \ \ t\geq0,
$$ $$
u_2(1,t)=0,\ \ \ t\geq0,
$$](https://dxdy-04.korotkov.co.uk/f/7/7/6/776061388fae1a2c7f0adbd5a1c5e36e82.png)
![$$
u_1(x_0,t)=u_2(x_0,t),\ \ t\geq 0,
$$ $$
u_1(x_0,t)=u_2(x_0,t),\ \ t\geq 0,
$$](https://dxdy-03.korotkov.co.uk/f/2/1/6/216a32bb2b367601a54e9b97b8e58aba82.png)
![$$
a_1\frac{\partial u_1(x,t)}{\partial
x}=a_2\frac{\partial u_2(x,t)}{\partial x},\ \ t\geq 0,
$$ $$
a_1\frac{\partial u_1(x,t)}{\partial
x}=a_2\frac{\partial u_2(x,t)}{\partial x},\ \ t\geq 0,
$$](https://dxdy-04.korotkov.co.uk/f/3/8/8/388e8062b85d332f81c73e8df70c103282.png)
![$$u_1(x_0,t)=f(t),\quad t\geq 0.$$ $$u_1(x_0,t)=f(t),\quad t\geq 0.$$](https://dxdy-02.korotkov.co.uk/f/9/7/6/976ce638c21f446db02783c484fff00a82.png)
И также имеется алгоритм численного решения методом проекционной регуляризации с исходными данными
1. Применяем к
![$f_{\delta}(t)$ $f_{\delta}(t)$](https://dxdy-02.korotkov.co.uk/f/9/7/8/9783e987b9de9dcb1627970326157cb082.png)
преобразование Фурье, находим
![$\hat{f_{\delta}}(\tau)$ $\hat{f_{\delta}}(\tau)$](https://dxdy-01.korotkov.co.uk/f/8/f/7/8f79beffeea47dc625862400ac03bcef82.png)
.
2. Нахождение
![$
\hat{h}_{\delta}^{\overline{\alpha}(\hat{f}_{\delta}(\tau),\delta)}=\hat{h}_{\delta}(\tau)
$ $
\hat{h}_{\delta}^{\overline{\alpha}(\hat{f}_{\delta}(\tau),\delta)}=\hat{h}_{\delta}(\tau)
$](https://dxdy-04.korotkov.co.uk/f/7/b/1/7b1cb3a199ac1c8698b134d9a0c89c2f82.png)
методом проекционной регуляризации
![$$
\hat{h}^{\alpha}_\delta(\tau)= \begin{cases} \frac{\sh\mu_0\biggl(\frac{(1-x_0)\sqrt{\tau}}{a_2}+\frac{x_0\sqrt{\tau}}{a_1}\biggr)}{\sh\mu_0(1-x_0)\frac{\sqrt{\tau}}
{a_2}}\cdot\hat{f}_\delta(\tau), \mu_0=(1+i)/\sqrt{2}, & \tau \leq \alpha,\\
0, &
\tau > \alpha.
\end{cases}
$$ $$
\hat{h}^{\alpha}_\delta(\tau)= \begin{cases} \frac{\sh\mu_0\biggl(\frac{(1-x_0)\sqrt{\tau}}{a_2}+\frac{x_0\sqrt{\tau}}{a_1}\biggr)}{\sh\mu_0(1-x_0)\frac{\sqrt{\tau}}
{a_2}}\cdot\hat{f}_\delta(\tau), \mu_0=(1+i)/\sqrt{2}, & \tau \leq \alpha,\\
0, &
\tau > \alpha.
\end{cases}
$$](https://dxdy-03.korotkov.co.uk/f/e/9/e/e9e894c0066d19d39c5661d708547e6782.png)
Значение параметра регуляризации
![$\alpha$ $\alpha$](https://dxdy-01.korotkov.co.uk/f/c/7/4/c745b9b57c145ec5577b82542b2df54682.png)
получим из принципа невязки
![$$
\int_{\alpha}^{\infty}|\hat{f}_{\delta}(\tau)|^2d\tau=9\delta^2.
$$ $$
\int_{\alpha}^{\infty}|\hat{f}_{\delta}(\tau)|^2d\tau=9\delta^2.
$$](https://dxdy-03.korotkov.co.uk/f/a/9/e/a9edac6536b0dbd57b3c8116ecf0406382.png)
Обозначим полученное значение параметра регуляризации через
![$\overline{\alpha}(\hat{f}_{\delta}(\tau),\delta)$ $\overline{\alpha}(\hat{f}_{\delta}(\tau),\delta)$](https://dxdy-03.korotkov.co.uk/f/6/1/9/6194a606e64af53f70cfc2b4824763a282.png)
.
3. Применяя обратное преобразование Фурье
![$F^{-1}$ $F^{-1}$](https://dxdy-02.korotkov.co.uk/f/5/8/8/588c6ca6a1ebf919bf90fee8a6c3d37682.png)
, получаем приближенное решение
![$h_\delta(t)$ $h_\delta(t)$](https://dxdy-02.korotkov.co.uk/f/5/d/0/5d092769620348b2e01167e28c3c914382.png)
![$$
h_\delta(t)=
\begin{cases}
\operatorname{Re}[F^{-1}[\hat{h}_\delta(\tau)]], & t \in [0,T],\\
0, & t \notin [0,T].
\end{cases}
$$ $$
h_\delta(t)=
\begin{cases}
\operatorname{Re}[F^{-1}[\hat{h}_\delta(\tau)]], & t \in [0,T],\\
0, & t \notin [0,T].
\end{cases}
$$](https://dxdy-03.korotkov.co.uk/f/e/3/2/e32d39687b026f3648ce479482aae66c82.png)
В качестве модельного примера была выбрана функция
![$
h_0(t)=
t\sin(\pi t), & t \in [0,1].
$ $
h_0(t)=
t\sin(\pi t), & t \in [0,1].
$](https://dxdy-02.korotkov.co.uk/f/1/8/3/183ee9afdafa74ecf78652b0cb1b2a3982.png)
Попробовал реализовать, вот что получилось (не судите строго)
public alglib.complex OperatorT(double r, double a1, double a2, double x0, double tau)
{
double arg2 = (1 - x0) * Math.Sqrt(tau) / a2 / Math.Sqrt(2);
double arg1 = arg2 + x0 * Math.Sqrt(tau) / a1 / Math.Sqrt(2);
alglib.complex T = new alglib.complex();
if (tau == 0) {
T.x = (x0 * a2 + a1 + x0 * a1) / (a1 - x0 * a1); // находится с помощью предела
T.y = (x0 * a2 + a1 + x0 * a1) / (a1 - x0 * a1);
}
else if (tau > r) { T.x = 0; T.y = 0; } // применение параметра регуляризации
else
{
T.x = (Math.Sinh(arg1) * Math.Cos(arg1) * Math.Sinh(arg2) * Math.Cos(arg2)
+ Math.Cosh(arg1) * Math.Sin(arg1) * Math.Cosh(arg2) * Math.Sin(arg2))
/ (Math.Sinh(arg2) * Math.Cos(arg2) * Math.Sinh(arg2) * Math.Cos(arg2)
+ Math.Cosh(arg2) * Math.Sin(arg2) * Math.Cosh(arg2) * Math.Sin(arg2));
T.y = (Math.Cosh(arg1) * Math.Sin(arg1) * Math.Sinh(arg2) * Math.Cos(arg2)
- Math.Sinh(arg1) * Math.Cos(arg1) * Math.Cosh(arg2) * Math.Sin(arg2))
/ (Math.Sinh(arg2) * Math.Cos(arg2) * Math.Sinh(arg2) * Math.Cos(arg2)
+ Math.Cosh(arg2) * Math.Sin(arg2) * Math.Cosh(arg2) * Math.Sin(arg2));
}
return T;
}
private void ButtonS_Click(object sender, RoutedEventArgs e)
{
int n = 512; // число узлов разбиения временного отрезка
alglib.xparams _params = new alglib.xparams(9);
alglib.complex [] a1 = new alglib.complex[n];
alglib.complex [] a2 = new alglib.complex[n];
alglib.complex[] a3 = new alglib.complex[n];
double [] r1 = new double[n];
double [] r2 = new double[n];
double[] r3 = new double[n];
double t = 1; // длина временного отрезка
double h = (double)t / (n - 1); //шаг разбиения
double[] xS = new double[n];
double[] Fs = new double[n];
double delta = 0.01; // уровень погрешности в начальных данных
Random r = new Random();
for (int i = 0; i <= n - 1; i++)
{
xS[i] = i * h;
r1[i] = xS[i] * Math.Sin(Math.PI * xS[i]); // функция из модельного примера
}
double x0 = 0.5, aa1 = 1, aa2 = 1; // ввод начальных данных
Par(r1, x0, ref r2); // нахождение r2 из решения прямой задачи в точке x0
// r2 - значения функции f(t), используемой в качестве начальных данных для обратной задачи
for (int i = 0; i <= n - 1; i++)
{ // внесение шума в начальные данные
double temp = -1 + 2 * r.NextDouble();
double dt = delta * temp / Math.Sqrt(t);
a1[i].x = r2[i] + dt;
a1[i].y = 0;
}
alglib.fft.fftc1d(ref a1, n, _params); // прямое преобразование Фурье
double td = 200; // длина отрезка по тау
double th = (double)td / (n - 1); // шаг разбиения
double R = 6; // параметр регуляризации
for (int i = 0; i <= n - 1; i++)
{ // оператор в методе проекионной регуляризации
alglib.complex T2 = new alglib.complex();
T2 = OperatorT(R, aa1, aa2, x0, i * th);
a2[i].x = (a1[i].x * T2.x - a1[i].y * T2.y);
a2[i].y = (a1[i].x * T2.y + a1[i].y * T2.x);
}
alglib.fft.fftc1dinv(ref a2, n, _params); // обратное преобразование Фурье
for (int i = 0; i <= n - 1; i++)
{
r3[i] = a2[i].x; // выделение Re
}
// отображение графиков
var X = xS.AsXDataSource();
var Y = r3.AsYDataSource();
var FS = r1.AsYDataSource();
CompositeDataSource compositeDataSource = X.Join(Y);
CompositeDataSource compositeDataSourceF = X.Join(FS);
plotter.AddLineGraph(compositeDataSource, Colors.Green, 2, "приближенное");
plotter.AddLineGraph(compositeDataSourceF, Colors.Red, 2, "точное");
}
Вот что получается
![Изображение](http://images.vfl.ru/ii/1603461386/19817479/32033866.png)
Меняя параметр регуляризации R, а также длину
![$\tau$ $\tau$](https://dxdy-01.korotkov.co.uk/f/0/f/e/0fe1677705e987cac4f589ed600aa6b382.png)
ничего лучше получить не удается. Само собой такое решение никуда не годится. Возможно я что-то делаю принципиально неправильно. Помогите, пожалуйста, разобраться.
Может есть примеры реализации подобной задачи, например, на MATLAB?