2014 dxdy logo

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

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


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Метод проекционной регуляризации
Сообщение23.10.2020, 17:01 


23/10/20
5
Доброго времени суток, уважаемые форумчане!

Пусть дана обратная задача нахождения функции $h(t)$ по имеющимся значениям $f(t)$
$$
\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_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,
$$
$$
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(0,t)=h(t),\ \ t\geq 0,
$$
$$
u_2(1,t)=0,\ \ \  t\geq0,
$$
$$
u_1(x_0,t)=u_2(x_0,t),\ \ 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,
$$

$$u_1(x_0,t)=f(t),\quad t\geq 0.$$

И также имеется алгоритм численного решения методом проекционной регуляризации с исходными данными

$$
a_1,~a_2,~x_0,~T,~f_{\delta}(t),~\delta.
$$

1. Применяем к $f_{\delta}(t)$ преобразование Фурье, находим $\hat{f_{\delta}}(\tau)$.

2. Нахождение $
\hat{h}_{\delta}^{\overline{\alpha}(\hat{f}_{\delta}(\tau),\delta)}=\hat{h}_{\delta}(\tau)
$ методом проекционной регуляризации
$$
\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}
$$

Значение параметра регуляризации $\alpha$ получим из принципа невязки
$$
\int_{\alpha}^{\infty}|\hat{f}_{\delta}(\tau)|^2d\tau=9\delta^2.
$$

Обозначим полученное значение параметра регуляризации через $\overline{\alpha}(\hat{f}_{\delta}(\tau),\delta)$.

3. Применяя обратное преобразование Фурье $F^{-1}$, получаем приближенное решение $h_\delta(t)$

$$
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_0(t)= 
t\sin(\pi t), & t \in [0,1].
$

Попробовал реализовать, вот что получилось (не судите строго)

код: [ скачать ] [ спрятать ]
Используется синтаксис C#
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, "точное");


}
 


Вот что получается

Изображение

Меняя параметр регуляризации R, а также длину $\tau$ ничего лучше получить не удается. Само собой такое решение никуда не годится. Возможно я что-то делаю принципиально неправильно. Помогите, пожалуйста, разобраться.

Может есть примеры реализации подобной задачи, например, на MATLAB?

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение23.10.2020, 17:35 
Заслуженный участник
Аватара пользователя


27/12/17
1439
Антарктика
vortex2 в сообщении #1488678 писал(а):
Само собой такое решение никуда не годится.

Почему такой вывод? Есть какие-то оценки погрешности, в рамки которых Вы не попадаете?

vortex2 в сообщении #1488678 писал(а):
Возможно я что-то делаю принципиально неправильно.

Вы спрашиваете мнение о программе? Просто складывается впечатление, что по части самого метода вопросов у Вас нет, но тогда какие проблемы могут быть с реализацией -- непонятно.

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение23.10.2020, 17:54 


23/10/20
5
thething в сообщении #1488689 писал(а):
Почему такой вывод? Есть какие-то оценки погрешности, в рамки которых Вы не попадаете?


Должно получиться наподобии такого (здесь разве что модельная задача немного другая):

Изображение

В моём случае даже без оценок погрешности видно, что с решением что-то не так.

thething в сообщении #1488689 писал(а):
Вы спрашиваете мнение о программе? Просто складывается впечатление, что по части самого метода вопросов у Вас нет, но тогда какие проблемы могут быть с реализацией -- непонятно.


В данном случае у меня вопросы по реализации. Оператор $R\hat{f}(\tau)=\sh\mu_0\biggl(\frac{(1-x_0)\sqrt{\tau}}{a_2}+\frac{x_0\sqrt{\tau}}{a_1}\biggr)\cdot
\sh^{-1}\mu_0(1-x_0)\frac{\sqrt{\tau}}{a_2}\cdot\hat{f}(\tau)$ найден верно.

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение23.10.2020, 18:07 
Заслуженный участник
Аватара пользователя


27/12/17
1439
Антарктика
thething в сообщении #1488689 писал(а):
Должно получиться наподобии такого (здесь разве что модельная задача немного другая):

Правильно я понимаю, с другой модельной задачей Ваша программа сработала хорошо?

А насчёт оценок -- это Вы зря. В таких задачах погрешности решения могут во много раз превосходить погрешности исходных данных. Визуальное сравнение тут -- не показатель.
vortex2 в сообщении #1488694 писал(а):
В данном случае у меня вопросы по реализации

Тут ничем помочь не могу, ибо си-шарп не знаю от слова совсем.

Аналогичные задачи с программными реализациями надо, по-видимому искать в диссертациях, в открытом доступе такие программы вряд ли есть.

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение23.10.2020, 18:15 


23/10/20
5
thething в сообщении #1488700 писал(а):
Правильно я понимаю, с другой модельной задачей Ваша программа сработала хорошо?


Нет, картинка взята из диссертации с очень похожей задачей. И, конечно же, никаких исходников там не было, как и вообще в интернете. Странно, что в литературе рассматриваются другие даже более сложные задачи. А по методу проекционной регуляризации нет никаких примеров, в том числе и на MATLAB.

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение23.10.2020, 18:15 
Заслуженный участник


09/05/12
25179
Если я правильно понял код (C# я тоже не знаю), у вас там вносится дополнительный шум, полная амплитуда которого раза в три больше, чем у "сигнала". Вы уверены, что в такой ситуации результат должен хоть сколько-нибудь соответствовать ожидаемому? Что будет, если зашумление полностью убрать?

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение23.10.2020, 18:28 


23/10/20
5
Pphantom в сообщении #1488703 писал(а):
Если я правильно понял код (C# я тоже не знаю), у вас там вносится дополнительный шум, полная амплитуда которого раза в три больше, чем у "сигнала". Вы уверены, что в такой ситуации результат должен хоть сколько-нибудь соответствовать ожидаемому? Что будет, если зашумление полностью убрать?


Если полностью убрать шум, то почти ничего не меняется

Изображение

А вот что будет, если вместо R=6 задать R=60 (без шума и с шумом соответственно).

Изображение
Изображение

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение24.10.2020, 05:24 
Заслуженный участник


22/11/10
1184
vortex2 в сообщении #1488694 писал(а):
В данном случае у меня вопросы по реализации. Оператор

$$
R\hat{f}(\tau)=\sh\mu_0\biggl(\frac{(1-x_0)\sqrt{\tau}}{a_2}+\frac{x_0\sqrt{\tau}}{a_1}\biggr)\cdot
\sh^{-1}\mu_0(1-x_0)\frac{\sqrt{\tau}}{a_2}\cdot\hat{f}(\tau)
$$

найден верно.

Похоже, здесь ошибка.
У меня получилась другая формула. Числитель не такой простой. С точностью до бантиков, там должно быть выражение вида
$$
\sinh (X) \cosh (Y) + \frac{a_2}{a_1}\sinh (Y) \cosh (X)
$$
Мне кажется, что Вы потеряли множитель $\frac{a_2}{a_1}$. После чего числитель свернулся в простой синус.

-- Сб окт 24, 2020 08:50:48 --

Хотя, там же условия склейки другие.
Виноват.

-- Сб окт 24, 2020 09:24:25 --

Еще один вопрос. Вы используете $FFT$. Это же означает, что вместо решения начально-краевой задачи, Вы ищете решение, периодическое по $t$. Для того, чтобы снизить искажения, возможно, стоит продолжить $f(t)$ нулем на бОльший интервал и решать там.

Для проверки собственно схемы вычислений можно попробовать в качестве $f(t)$ брать чистые экспоненты (комплексные). Для них все промежуточные вычисления можно явно проконтролировать. Только лучше брать показатель "несоизмеримый" с интервалом $(0,T)$.

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение29.10.2020, 12:31 


23/10/20
5
sup в сообщении #1488786 писал(а):

Еще один вопрос. Вы используете $FFT$. Это же означает, что вместо решения начально-краевой задачи, Вы ищете решение, периодическое по $t$. Для того, чтобы снизить искажения, возможно, стоит продолжить $f(t)$ нулем на бОльший интервал и решать там.



Спасибо. Да, действительно, после увеличения интервала получилось что-то похожее на правду.

Изображение

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

 Профиль  
                  
 
 Re: Метод проекционной регуляризации
Сообщение29.10.2020, 13:14 
Заслуженный участник


22/11/10
1184
Таким образом, данный метод выглядит не очень надежным.
Вообще-то, это известная "некорректная" задача о продолжении. После некоторых простых преобразований и замен задача сводится к виду
$$
\begin{align}
&u_t - u_{xx} = 0,  &(t, x) \in (0,T) \times (0,1) \\
&u(0,x) = 0, &x \in (0,1),\\
&u(t,0) = 0, &t \in (0,T),\\
&u_x(t,0) = f(t), &t \in (0,T),
\end{align}
$$
Требуется найти $v(t) = u(t, 1)$. Т.е. вместо того, чтобы задавать краевые условия (по $x$) на обеих стенках, задаем данные Коши на одной стенке.
Легко показать, что эта задача эквивалентна уравнению Вольтерры первого рода сверточного типа
$$
\int \limits_0^t K(t - s)v(s) \, ds = f(t).
$$
К сожалению, с разрешимостью таких уравнений "большие проблемы". Есть необходимые и достаточные условия разрешимости таких уравнений в классах конечной гладкости, но они не слишком удобные. А в данном случае, вероятнее всего, не выполнены. Поэтому задача и некорректная.

Если уж Вы хотите использовать $FFT$, то лучше это сделать для данного интегрального уравнения.
Ядро $K(t)$ можно предъявить в виде некого "неудобного" ряда. А можно явно указать преобразование Лапласа $\hat K(t)$.

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

Модераторы: Модераторы Математики, Супермодераторы



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

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


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

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