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

ВМ / Лабы / Готовые лабы / 2 / лаба 1 / Л.Р. #1 Выч Мат (Деление отрезка) / Метод половинного деления

.doc
Скачиваний:
108
Добавлен:
13.10.2016
Размер:
286.21 Кб
Скачать

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

ОТЧЁТ

по лабораторной работе №1

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

Отчёт подготовил:

студент ПО0801

Лапкин С.А.

Преподаватель:

Гловацкая А.П.

Москва 2009 г.

Задание на лабораторную работу

  1. Выбрать индивидуальное задание из табл. 6.2-1 по указанию преподавателя:

  • нелинейное уравнение;

  • метод решения нелинейных уравнений для «ручного расчета»;

  • метод решения нелинейных уравнений для «расчета на ПК».

  1. Отделить корни уравнения.

  2. Провести исследование нелинейного уравнения для «ручного расчета»:

  • проверить выполнение условий сходимости вычислительного процесса, в случае расходящегося процесса – сделать необходимые преобразования для обеспечения сходимости;

  • выбрать начальное приближение;

  • сформулировать условия окончания этапа уточнения корня.

  1. Провести «ручной расчет» трех итераций.

  2. Оценить погрешность результата «ручного расчета».

  3. Провести исследование нелинейного уравнения для «решения на ПК»:

  • проверить выполнение условий сходимости вычислительного процесса, в случае расходящегося процесса – выполнить последовательность шагов для обеспечения сходимости;

  • выбрать начальное приближение;

  • сформулировать условия окончания процесса уточнения корня.

  1. Составить схему алгоритма, написать программу для решения нелинейных уравнений для «расчета на ПК» и провести контрольное тестирование программы, воспользовавшись исходными данными и результатами примера из п. 6.2-5.

  2. Решить нелинейное уравнение с различной точностью, воспользовавшись написанной программой для «расчета на ПК».

  3. Вычислить «погрешность» результата «расчета на ПК» при известном точном решении.

  4. Построить зависимость числа итераций от заданной точности – n(E).

  5. Решить нелинейное уравнение с помощью математических пакетов.

Метод половинного деления.

Нелинейное уравнение : 4 (x2 + 1) ln(x) – 1 = 0

Решение:

1.Построим график функции:

Если непрерывная функция принимает значения разных знаков на концах отрезка, то внутри этого отрезка существует по меньшей мере один корень уравнения т.е. такое значение x* , что .

f(0.7)= -3.126

f(1.4)= 2.984

Значит на отрезке [0.7;1.4] существует по крайней мере 1 корень ур-я;

Докажем его единственность:

Вторая производная на отрезке [0.7;1.4] монотонна (не меняет знак) и больше 0, а т.к. первая производная на этом отрезке так же монотонна и больше 0, то корень на отрезке [0.7;1.4] - единственный.

2.Вычислим корень уравнения аналитически средствами MathCad :

В качестве точного решения уравнения примем X*=1.117576

3.Выберем за начальное приближение середину отрезка =1.05.

Результаты «ручного расчета» трех итераций:

Результаты вычислений в виде таблицы:

n

a

b

f(a)

f(b)

(a+b)/2

f( (a+b)/2)

b-a

1

0.7

1.4

-3.126

2.984

1.05

-0.59

0.7

2

1.05

1.4

-0.59

2.984

1.225

1.03

0.35

3

1.05

1.225

-0.59

1.03

1.137

0.178

0.220

4

1.05

1.137

-0.59

0.178

1.094

-0.211

0.132

После трех итераций приближение к корню x3=1.094

4.Оценим погрешности результатов:

Погрешность равна |X*-X3|= 0.024

5. Схема алгоритма половинного деления:

Код программы:

#include<iostream>

#include<conio.h>

#include <math.h>

using namespace std;

void rass4et(double a,double b,double E);

double myfunc(double x) //ф-ция по заданию

{

double myfunc;

myfunc=x+log(4*x)-1;

return myfunc;

}

void main ()

{

setlocale( LC_ALL,"Russian" ); //подключение возможности вывода русских букв

double a,b,E; // а - левая граница, b - правая граница, Е - точность

do{

cout<<"Программа рассчёта корня нелинейного ур-я методом деления отрезков пополам\n\n";

cout<<"Введите границу a:";

cin>>a;

cout<<"Введите границу b:";

cin>>b;

cout<<"Введите точность вычислений Е:";

cin>>E;

rass4et(a,b,E);

cout<<"\n\n повторить рассчёт данных? [Y/N]";}

while(getch()=='y');

}

void rass4et(double a,double b,double E)

{

double c=(a+b)/2,fc,fb,fa; // вычисление х0 ( первая середина отрезка )

int n=0;

cout<<"a="<<a<<" b="<<b<<"\nсередина(c)="<<c;

while((b-a)>=E) //условия завершения подсчёта точности

{

n=n+1; // кол-во итераций

if(myfunc(c)*myfunc(b)<0) //условие замены левой/правой границы

{

a=c;

}

else

{

b=c;

}

fa=myfunc(a); // значение ф-ции в левой границе

fb=myfunc(b); // значение ф-ции в правой границе

cout<<"\n\n["<<a<<","<<b<<"]\n\tf(a)="<<fa<<"\n\tf(b)="<<fb;

c=(a+b)/2; //вычисление следующей середины

}

fc=myfunc(c);// значение ф-ции на итерации n

cout<<"\n\nРезультаты вычислений:\n x="<<c<<"\nf(x)="<<fc<<"\n шаг итерации="<<n;

}

6. Результаты «расчета на ПК»:

E

n

x

f(x)

0.01

7

1.11836

0.0070905

0.001

10

1.11733

-0.00218513

0.0001

13

1.11755

-0.00025354

  1. Погрешность результата «расчета на ПК»

Примем за точное решение x*=1.117576

ε

Погрешность

0.01

0.000784

0.001

0.000246

0.0001

0.000026

Страница 8

Соседние файлы в папке Л.Р. #1 Выч Мат (Деление отрезка)