ВМ / Лабы / Готовые лабы / 2 / лаба 1 / Л.Р. #1 Выч Мат (Деление отрезка) / Метод половинного деления
.docМОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ
ОТЧЁТ
по лабораторной работе №1
«Методы решения нелинейных уравнений»
Отчёт подготовил:
студент ПО0801
Лапкин С.А.
Преподаватель:
Гловацкая А.П.
Москва 2009 г.
Задание на лабораторную работу
-
Выбрать индивидуальное задание из табл. 6.2-1 по указанию преподавателя:
-
нелинейное уравнение;
-
метод решения нелинейных уравнений для «ручного расчета»;
-
метод решения нелинейных уравнений для «расчета на ПК».
-
Отделить корни уравнения.
-
Провести исследование нелинейного уравнения для «ручного расчета»:
-
проверить выполнение условий сходимости вычислительного процесса, в случае расходящегося процесса – сделать необходимые преобразования для обеспечения сходимости;
-
выбрать начальное приближение;
-
сформулировать условия окончания этапа уточнения корня.
-
Провести «ручной расчет» трех итераций.
-
Оценить погрешность результата «ручного расчета».
-
Провести исследование нелинейного уравнения для «решения на ПК»:
-
проверить выполнение условий сходимости вычислительного процесса, в случае расходящегося процесса – выполнить последовательность шагов для обеспечения сходимости;
-
выбрать начальное приближение;
-
сформулировать условия окончания процесса уточнения корня.
-
Составить схему алгоритма, написать программу для решения нелинейных уравнений для «расчета на ПК» и провести контрольное тестирование программы, воспользовавшись исходными данными и результатами примера из п. 6.2-5.
-
Решить нелинейное уравнение с различной точностью, воспользовавшись написанной программой для «расчета на ПК».
-
Вычислить «погрешность» результата «расчета на ПК» при известном точном решении.
-
Построить зависимость числа итераций от заданной точности – n(E).
-
Решить нелинейное уравнение с помощью математических пакетов.
Метод половинного деления.
Нелинейное уравнение : 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
-
Погрешность результата «расчета на ПК»
Примем за точное решение x*=1.117576
-
ε
Погрешность
0.01
0.000784
0.001
0.000246
0.0001
0.000026
|
|
Страница |
|
|
|
|
