Опубликован: 18.05.2011 | Доступ: свободный | Студентов: 968 / 105 | Оценка: 4.40 / 4.20 | Длительность: 12:30:00
Лекция 12:

О решении операторных уравнений

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

Перейдем к программированию классов для реализации операторного подхода к решению задачи 11.1 - 11.2.

\begin{verbatim}
// класс для вычисления оператора
class TOE {
    TD2Q D2Q;

    public TOE(double q, TRFunc F)
    {
        D2Q = new TD2Q(q, new TL2Right(F));
    }

    public double Y(double x)
    {
        return D2Q.Calc(x);
    }
}

// класс оператора
class TD2Q : TL2Operator {
    double q;
    public TD2Q(double q, THElement u) : base(u)
    {
        if (q < 0)
        {
            this.q = 0;
        }
        else
        {
            this.q = q;
        }
    }

    public override double alpha(int k)
    {
        double kx = (double)k;

        return 1.0 / (kx * kx + q);
    }
}
\end{verbatim}
\begin{verbatim}
// класс - базисные функции
class TE_k : TRFunc
{
    int k;
    public TE_k(int k) : base(0, Math.PI)
    {
        this.k = k;
    }

    protected override TElement CalcVal(double x)
    {
        TElement res = new TElement(Math.Sqrt(2.0 / Math.PI) *
        Math.Sin((double)k * x));
        return res;
    }
}
\end{verbatim}
\begin{verbatim}
// класс - правые части уравнения
class TL2Right : TL2Element
{
    protected TLSpace Ld;
    protected TRFunc F;
    public TL2Right(TRFunc F)
    {
        Ld = new TLSpace();
        this.F = F;
    }

    // разложение по базису
    public override double a(int k)
    {
        TE_k e_k = new TE_k(k);
        return Ld.inner(F, e_k);
    }
}

class TRight1 : TRFunc
{
    public TRight1() : base(0, Math.PI) { }

    protected override TElement CalcVal(double x)
    {
        TElement res = new TElement(1.0);
        return res;
    }
}
\end{verbatim}
\begin{verbatim}
class TRight2 : TRFunc
{
    public TRight2() : base(0, Math.PI) { }

    protected override TElement CalcVal(double x)
    {
        TElement res = new TElement(Math.Sin(x));
        return res;
    }
}

class TRight3 : TRFunc
{
    public TRight3() : base(0, Math.PI) { }

    protected override TElement CalcVal(double x)
    {
        TElement res = new TElement(Math.Cos(x));
        return res;
    }
}
\end{verbatim}

Теперь будем решать численно нашу задачу для разных значений q и правых частей f(x).

\begin{verbatim}
TRight1 F1 = new TRight1();
TOE OE = new TOE(0, F1);

Console.WriteLine("q = 0; f(x)=1; Y(1) = {0}", OE.Y(1.0));

TRight2 F2 = new TRight2();
OE = new TOE(0, F2);
Console.WriteLine("q = 0; f(x)=sin(x); Y(1) = {0}", OE.Y(1.0));

TRight3 F3 = new TRight3();
OE = new TOE(0, F3);
Console.WriteLine("q = 0; f(x)=cos(x); Y(1) = {0}", OE.Y(1.0));

OE = new TOE(10.0, F1);
Console.WriteLine("q = 10; f(x)=sin(x); Y(1) = {0}", OE.Y(1.0));

OE = new TOE(10.0, F2);
Console.WriteLine("q = 10; f(x)=sin(x); Y(1) = {0}", OE.Y(1.0));

OE = new TOE(10.0, F3);
Console.WriteLine("q = 10; f(x)=cos(x); Y(1) = {0}", OE.Y(1.0));
\end{verbatim}

В итоге получим следующие результаты:

\begin{verbatim}
q = 0; f(x)=1; Y(1) = 1.07079628676603

q = 0; f(x)=sin(x); Y(1) = 0.841470984797919

q = 0; f(x)=cos(x); Y(1) = 0.176922106919835

q = 10; f(x)=sin(x); Y(1) = 0.0956527832996927

q = 10; f(x)=sin(x); Y(1) = 0.0764973622552322

q = 10; f(x)=cos(x); Y(1) = 0.0453741941981012
\end{verbatim}

Сравним наши результаты с точными решениями при q=0. Задача

-y''(x)=1,\ x\in(0,\pi),
y(0)=y(\pi)=0
Имеет точное решение
y(x)=-\frac{1}{2}x^2+\frac{\pi}{2}x,
значение y(1) равно
y(1)=-\frac{1}{2}+\frac{\pi}{2}=1.0707963267948966192313216916398\dots.
Задача
-y''(x)=\sin(x),\ x\in(0,\pi),
y(0)=y(\pi)=0
Имеет точное решение
y(x)=\sin(x)
значение y(1) равно
y(1)=0.8414709848078965066525023216303\dots.
Задача
-y''(x)=\cos(x),\ x\in(0,\pi),
y(0)=y(\pi)=0
Имеет точное решение
y(x)=\cos x +\frac{2}{\pi}x-1
значение y(1) равно
y(1)=0.17692207823572106047647166093303\dots.
Мы видим, что наши численные результаты довольно точны. Однако если бы мы использовали аналитические выражения для коэффициентов Фурье, то точность и скорость вычислений были бы значительно выше. Это выражает тот факт, что использование теоретических знаний при конструировании численных методов могут значительно увеличить эффективность последних.

Ключевые термины

Гильбертово пространство L_2(0,\pi) - наиболее известное гильбертово функциональное пространство, состоящее из измеримых функций, интегрируемых в квадратом модуля.

Краевая задача - дифференциальное уравнение с заданными условиями на решение на концах отрезка.

Метод Галеркина - общий метод для приближенного нахождения решений операторных уравнений.

Краткие итоги: Подробно рассмотрены методы численного решения краевой задачи для дифференциального уравнения второго порядка. С помощью реализованных классов, проведены различные вычислительные эксперименты.

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >