Главная страница
Навигация по странице:

  • ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ БЮДЖЕТНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

  • «Методы решения нелинейных уравнений»

  • Москва 2021 Индивидуальное задание

  • Протокол вычислений Отделение корней

  • Уточнение корней методом Ньютона

  • Решение уравнения функцией fsolve()

  • ВЫ изучали СИ++. Вот в этой среде и надо программировать!!!

  • Схему алгоритма я давал на лекции. Вот ее и используйте.

  • Федеральное государственное образовательное ордена трудового красного знамени бюджетное учреждение высшего профессионального


    Скачать 0.65 Mb.
    НазваниеФедеральное государственное образовательное ордена трудового красного знамени бюджетное учреждение высшего профессионального
    Анкор25 dfhvfyn
    Дата20.04.2022
    Размер0.65 Mb.
    Формат файлаdocx
    Имя файлаlab1_25.docx
    ТипЛабораторная работа
    #485878

    ФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ

    ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ

    ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ

    БЮДЖЕТНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО

    ОБРАЗОВАНИЯ

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

    (МТУСИ)

    Кафедра информатики

    Лабораторная работа № 1

    «Методы решения нелинейных уравнений»

    Почему все-таки берете х0 =1.? Ведь это условие f(1) * f´´(x) > 0 в т. 1 не выполняется нигде, т.к. 2 производная везде отрицательная. Но метод все равно сходится. Объясните
    Точка 1 выбрана, т.к. находится в промежутке [1; 2], где f(1)*f``(1) < 0 и f(2)*f``(2) > 0. В отчёте была допущена опечатка, границы были 0 и 1 соответственно.

    Выполнил студент группы “Сортирный Союз”

    username

    Москва 2021

    Индивидуальное задание



    Уравнение

    1-й метод

    2-й метод

    25

    cos(x/5)(1+x)1/2-x = 0

    Половинное деление

    Метод Ньютона



    Протокол вычислений

    1. Отделение корней




    format(8);

    disp(p);

    1. 0.38602 -0.70969 -0.58733

    1.2 0.24073 -0.74308 -0.69942

    1.4 0.08886 -0.77545 -0.74921

    1.6 -0.0694 -0.8071 -0.78992

    1.8 -0.23395 -0.83824 -0.82642

    2. -0.40468 -0.86901 -0.86053

    function s = fi(x)

    deff('y = f(x)', 'y = cos(x / 5) * (1 + x)^(0.5) - x');

    plot([1 : 0.2 : 2], f);

    xtitle('', 'x', 'f(x)')

    xgrid;

    dy = numderivative(f, x);

    dy2 = numderivative(f, x, 2);

    s = [x, f(x), dy, dy2];

    endfunction

    p = zeros(6, 4);

    x = 1 : 0.2 : 2;

    for i = 1 : 6

    p(i, :) = fi(x(i));

    end







    Вывод: на концах отрезка [1; 2] функция имеет противоположные знаки, 1-я производная знакопостоянна - значит, на этом отрезке уравнение имеет единственный корень

    1. Уточнение корней методом половинного деления


    function fbs = f(x) //lab_1_1.sci

    fbs = cos(x / 5) * (1 + x)^(0.5) - x;

    endfunction

    disp(' n a b f(a) f(b) c=(a+b)/2 f(c) b-a');

    n = 0; fa = f(a); fb = f(b); c = (a + b) / 2; fc = f(c);

    z = [n, a, b, fa, fb, c, fc, b - a];

    disp(z);

    for n = 1 : 3

    if f(c) * f(a) < 0 then b = c;

    else a = c;

    end

    fa = f(a); fb = f(b); c = (a + b) / 2; fc = f(c);

    z = [n, a, b, fa, fb, c, fc, b - a];

    disp(z);

    c = (a + b) / 2;

    end

    На отрезке [1; 2] условие сходимости для функции выполняется; начальным приближением x0 является точка 1,5



    a = 1; b = 2;

    exec('/home/peppermint/Documents/study/chislometh/lab_1_1.sci');

    " n a b f(a) f(b) c=(a+b)/2 f(c) b-a"

    0. 1. 2. 0.38602 -0.40468 1.5 0.01052 1.

    1. 1.5 2. 0.01052 -0.40468 1.75 -0.19223 0.5

    2. 1.5 1.75 0.01052 -0.19223 1.625 -0.08963 0.25

    3. 1.5 1.625 0.01052 -0.08963 1.5625 -0.03925 0.125




    n

    a

    b

    f(a)

    f(b)

    c=(a+b)/2

    f(c)

    b-a

    0

    1

    2

    0.38602

    -0.40468

    1.5

    0.01052

    1

    1

    1.5

    2

    0.01052

    -0.40468

    1.75

    -0.19223

    0.5

    2

    1.5

    1.75

    0.01052

    -0.19223

    1.625

    -0.08963

    0.25

    3

    1.5

    1.625

    0.01052

    -0.08963

    1.525

    -0.03925

    0.125

    После трёх итераций приближение к корню x3 = 1.525
    Погрешность результата: |b3 - a3| = 0.125

    1. Уточнение корней методом Ньютона

    Из условия, где f(1) * f´´(1) < 0 и f(2) * f´´(2) > 0 выберем начальное приближение к корню x0 = 1.

    Функция и 2 производная имеют разные знаки в т. х=1?????
    Для получения решения методом Ньютона воспользуемся рекуррентной формулой xn+1=xn-f(xn)/f´(xn).


    #include "iostream"

    #include "cmath"

    using namespace std;
    double func_orig(double x)

    {

    return cos(x / 5) * pow(1 + x, 0.5) - x;

    }

    double func_der(double x)

    {

    return -((sqrt(x + 1) * sin(x / 5)) / 5) - 1 + (cos(x / 5) / (2 * sqrt(x + 1)));

    }

    int main()

    {

    int n = 0;

    double x_curr = 0.5, x_last = 1;

    cout << "n x f(x) f'(x)" << endl;

    while (abs(x_last - x_curr) > 1E-4)

    {

    x_last = x_curr;

    n++;

    x_curr = x_last - (func_orig(x_last) / func_der(x_last));

    cout << n << " " << x_curr << " " << func_orig(x_curr) << " " << func_der(x_curr) << endl;

    }

    return 0;

    }


    НЕВЕРНО! Программируемый метод делается до заданной точности!!!!!! Исправить!

    k

    xk

    f(xk)

    0

    1

    0.38602

    1

    1.66236

    -0.120042

    2

    1.51541

    -0.00169197

    3

    1.51328

    -3.58939e-07

    4

    1.51328

    -1.62093e-14



    1. Решение уравнения функцией fsolve()



    deff('y = g(x)', 'y = cos(x / 5) * (1 + x)^(0.5) - x');

    fx = fsolve(0, g)

    fx =

    1.51328


    Скриншоты:







    ВЫ изучали ? СИ++. Вот в этой среде и надо программировать!!!

    Нет, не изучал, но читал достаточное количество кода на данном языке программирования. На первом курсе обучение программированию проходило на VB.Net, а в методичке (и в лекциях) ни слова не сказано про использование конкретного «средства программирования». Как я понимаю, писать можно на чём угодно, но специально по вашей просьбе мною была написана реализация на C++.

    Схему алгоритма я давал на лекции. Вот ее и используйте.







    написать администратору сайта