Добавил:
Здесь представлены мои работы, надеюсь они Вам помогут, всех благ! Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

чм 4

.docx
Скачиваний:
22
Добавлен:
09.04.2023
Размер:
170.87 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ»

ЛАБОРАТОРНАЯ РАБОТА №4

«Методы решения обыкновенных дифференциальных уравнений»

Выполнил: Ядринцев С.М.

Проверил: Сосновиков Г.К.

Москва 2022

Общее задание

  1. Выбрать индивидуальное задание в табл. 4-1 для решения обыкновенных дифференциальных уравнений:

    • Дифференциальное уравнение y’=f(x,y);

    • Интервал [a; b], где ищется решение дифференциального уравнения;

    • начальные условия , ;

    • шаг интегрирования .

  2. Найти аналитическое решение y=y(x) заданного дифференциального уравнения, полагая его точным.

  3. Создать в сценарии функцию для вычисления значения полученного решения y(x) на отрезке [a;b] с шагом .

  4. Создать в сценарии функцию для вычисления значений численное значение решение дифференциального уравнения методом Эйлера - в точках отрезка [a;b] с шагом .

  5. Вычислить значение погрешностей для , .

  6. Написать и выполнить программу, реализующую программу решения дифференциального уравнения методом Рунге-Кутта 4-го порядка в точках отрезка [a;b] с шагом , обеспечив с использованием метода автоматического выбора шага, точность 10-4.

  7. Вычислить значение погрешностей для , .

  8. Найти решения дифференциального уравнения использованием функции пакета Scilab ode.

  9. Проиллюстрировать решение , в одной системе координат.

Индивидуальный вариант задания

  1. Задание для численного решения обыкновенных дифференциальных уравнений:

  • Дифференциальное уравнение

  • Интервал [0; 0.6];

  • начальные условия , шаг интегрирования .

  • Точное аналитическое решение заданного дифференциального уравнения:

    Найдем точное аналитическое решение заданного дифференциального уравнения (решение y=y(x)).

    Из начальных условий следует, что C = 1.

    Аналитическое решение дифференциального уравнения примет вид

    1. Значение точного решения ОДУ - :

    n

    0

    0

    1

    1

    0.2

    1.0408108

    2

    0.4

    1.1735109

    3

    0.6

    1.4333294


    //Сценарий точного решения ОДУ

    function y=resh(x, n)

    function y=func(x)

    y=exp(x.^2);

    end

    disp('Точное решения ОДУ');

    disp(' n xi y(xi)');

    for i=1:n+1

    y(i)=func(x(i));

    z=[i-1,x(i),y(i)]

    disp(z);

    end

    endfunction

    1. Численное решение ОДУ методом Эйлера:

    n

    0

    0

    1

    1

    0.2

    1

    2

    0.4

    1.08

    3

    0.6

    1.2528


    //Сценарий численного решение ОДУ методом Эйлера

    function y=eler(x, h, n)

    function yy=func(x, y)

    yy=2*x.*y;

    end

    x(1)=0; y(1)=1;

    disp('Численное решение ОДУ методом Эйлера');

    disp(' n xi yЭ(xi)');

    z=[0,x(1),y(1)];

    disp(z);

    for i=2:n+1

    y(i)=y(i-1)+h*func(x(i-1),y(i-1));

    z=[i-1,x(i),y(i)]

    disp(z);

    end

    endfunction

    1. Значение погрешностей:

    n

    0

    0

    0

    1

    0.2

    0.0408108

    2

    0.4

    0.0935109

    3

    0.6

    0.1805294


    //Сценарий погрешности точного решения и Эйлера

    function E=pogrel(x, n, yr, ye)

    disp('Погрешность между точным решением и методом Эйлера');

    disp(' n xi Ei');

    for i=1:n+1

    E(i)=abs(yr(i)-ye(i));

    z=[i-1,x(i),E(i)]

    disp(z);

    end

    endfunction

    1. Результаты решения ОДУ методом Рунге-Кутта 4-го порядка, дополненным методом автоматического выбора шага, обеспечивающим точность 10-4:

    n

    0

    0

    1

    1

    0.2

    1.0408

    2

    0.4

    1.1735

    3

    0.6

    1.4333


    //код решения ОДУ

    #include<iostream>

    #include<cmath>

    using namespace std;

    double fun(double x, double y)

    {

    double f =2*x*y;

    return(f);

    }

    double r(double x, double y, double h, int m)

    {

    double k1, k2, k3, k4;

    for (int j = 1; j <= m; j++)

    {

    k1 = fun(x, y);

    k2 = fun(x + h / 2, y + h * k1 / 2);

    k3 = fun(x + h / 2, y + h * k2 / 2);

    k4 = fun(x + h, y + h * k3);

    y = y + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);

    x = x + h;

    }

    return(y);

    }

    void diff(double x0, double y0, double h0, double Ex, double b)

    {

    int n, i, m = 0;

    double h, y, y1, x;

    n = (b - x0) / h0+1;

    cout << "x y h m\n";

    printf("%.4f %.4f %.4f %d \n", x0, y0, h0, m);

    for (int j = 1; j <= n; j++)

    {

    h = h0;

    m = 1;

    y = r(x0, y0, h, m);

    do

    {

    y1 = y;

    h = h / 2;

    x = x0;

    y = y0;

    m = 2 * m;

    y = r(x, y, h, m);

    } while (abs(y - y1) > Ex);

    x0 = x0 + h0;

    y0 = y;

    printf("%.4f %.4f %.4f %d \n", x0, y0, h, m);

    }

    }

    int main()

    {

    double x0 = 0, y0 = 1, h0 = 0.2, ex = 0.0001, b = 0.6;

    diff(x0, y0, h0, ex, b);

    }

    1. Значение погрешностей :

    1. n

    0

    0

    0

    1

    0.2

    0.0000108

    2

    0.4

    0.0000109

    3

    0.6

    0.0000294


    //Сценарий погрешности точного решения и Рунге-Кутта

    function del=pogrk(x, n, yr, yrk)

    disp('Погрешность между точным решением и методом Рунге-Кутта');

    disp(' n xi Deli');

    for i=1:n+1

    del(i)=abs(yr(i)-yrk(i));

    z=[i-1,x(i),del(i)]

    disp(z);

    end

    endfunction

    Все решения полученные выше

    0

    1

    1

    0

    1

    0

    0.2

    1.0408108

    1

    0.0408108

    1.0408

    0.0000108

    0.4

    1.1735109

    1.08

    0.0935109

    1.1735

    0.0000109

    0.6

    1.4333294

    1.2528

    0.1805294

    1.4333

    0.0000294

    1. Решение ОДУ с использованием функции ode пакета Scilab:

      function yd=f(t, y)

      yd=2*t.*y;

      endfunction

      y=1; t0=0; t=0:0.2:0.6;

      z=ode(y,t0,t,f);

      disp('Решение ОДУ функцией ode');

      zz=[t;z];

      disp(zz');

    2. Все решения в одной системе координат:

    //Сценарий вызова других функций и построения графиков

    a=0; b=0.6; h=0.2;

    n=(b-a)/h;

    for i=1:n+1

    x(i)=a+(i-1)*h;

    end

    yr=resh(x,n);

    ye=eler(x,h,n);

    pogrel(x,n,yr,ye);

    yrk=evstr(x_dialog('Ведите значения оду в точках по Рунге_Кутту',''));

    pogrk(x,n,yr,yrk');

    plot(x,yr,'k-o');

    plot(x,ye,'r-');

    plot(x,yrk','b-');

    xgrid();

    xtitle('Решение ОДУ','x','y(x), y1(x), y4(x)');

    legend('y(x)','y1(x)','y4(x)');

  • Соседние файлы в предмете Численные методы