Численное нахождение корня функции
Минобрнауки
России
Федеральное
государственное бюджетное образовательное учреждение
высшего
профессионального образования
"Нижегородский
государственный технический университет
им.
Р.Е. Алексеева"
Арзамасский
политехнический институт (филиал)
Лабораторная
работа
по
дисциплине "Численные методы"
Вариант
№6
Выполнили:
студентки гр. АСПМ 12-1
Кузнецова Ольга
Минеева Ирина
Архипова Екатерина
Проверил преподаватель:
Эварт Т.Е.
Арзамас
г.
Задание №1
корень дихотомия ньютон программа
Выполнить отделение корней для функции
Выполнить уточнение корней с точностью 0,001,
используя метод дихотомии, метод Ньютона, метод простой итерации.
Решение.
) Метод дихотомии
Листинг программы на С++
#include<iostream>
#include<cmath>
#include<iomanip>namespace std;
//прототип функции - правая частьf (double x0);
//прототип функции - метод половинного
деленияpol(double a, double b, double eps, int& t);main()
{(LC_ALL,"Russian");a,b,eps,R1,x1;t1;<<"\n
Ввести начало отрезка а = ";>>a;<<"\n Ввести конец
отрезка b = ";>>b;<<"\n Ввести точность eps =
";>>eps;<<"\n*** Метод дихотомии
***\n";<<"\n Начало отрезка а =
"<<a;<<"\n Конец отрезка b =
"<<b;<<"\n Точность eps =
"<<eps;=pol(a,b,eps,t1);=(b-a)/(pow(2.0,t1));<<"\n Корень
x="<<x1;<<"\n Количество итераций
t="<<t1;<<"\n Абсолютная погрешность метода
R1="<<R1;<<endl;
}
//определение функции - правая частьf (double
x0)
{y;=pow((x0+1),3)+log(x0);y;
}
//определение функции - метод половинного
деленияpol(double a, double b, double eps, int& t)
{x0;=1;:x0=(a+b)/2;(f(x0)==0) goto
c1;if(f(a)*f(x0)<0) b=x0;a=x0;(abs(b-a)>2*eps) {
t++;c;
}: return x0;
}
Результат работы программы
Ввести начало отрезка а = 0.1
Ввести конец отрезка b = 0.2
Ввести точность eps = 0.001
*** Метод дихотомии ***
Начало отрезка а = 0.1
Конец отрезка b = 0.2
Точность eps = 0.001
Корень x=0.185938
Количество итераций t=6
Абсолютная погрешность метода R1=0.0015625
Для продолжения нажмите любую клавишу . . .
) Метод Ньютона
Листинг программы на С++
#include<iostream>
#include<cmath>
#include<iomanip>namespace std;
//прототип функции - правая частьf (double x0);
//прототип функции - правая часть - первая
производнаяf1 (double x0);
//прототип функции - правая часть - вторая
производнаяf2 (double x0);
//прототип функции - метод Ньютонаnewton(double
x0, double eps,double M, double m,double& x, int& t, double&
R);main()
{setlocale(LC_ALL,"Russian");M,m,eps,R2,x2,x0;t2;<<"\n
Ввести точность eps = ";>>eps;<<"\n Ввести абсолютное
максимальное значение второй производной функции правой части уравнения на
заданном отрезке M = ";>>M;<<"\n Ввести абсолютное
минимальное значение первой производной функции правой части на заданном
отрезке m = ";>>m;<<"\n Ввести начальное приближение x0 =
";>>x0;<<"\n***Метод Ньютона ***\n";<<"\n
Абсолютное максимальное значение второй производной функции правой части
уравнения на заданном отрезке M = "<<M;<<"\n Абсолютное
минимальное значение первой производной функции правой части на заданном
отрезке m = "<<m;<<"\n Точность eps =
"<<eps;<<"\n Начальное приближение x0 =
"<<x0;(x0,eps,M,m,x2,t2,R2);<<"\n Корень
x="<<x2;<<"\n Количество итераций
t="<<t2;<<"\n Абсолютная погрешность метода
R2="<<R2;<<endl;
}
//определение функции - правая частьf (double
x0)
{y;=pow((x0+1),3)+log(x0);y;
}
//определение функции - правая часть - первая
производнаяf1 (double x0)
{y;=3*pow((x0+1),2)+1/x0;y;
}
{y;=6*(x0+1)-(1/pow(x0,2));y;
}
//определение функции - метод
Ньютонаnewton(double x0, double eps,double M, double m,double& x, int&
t, double& R)
{(f(x0)*f1(x0)>0)
{<<"\n Уравнение методом Ньютона
решается\n";=1;:x=x0-f(x0)/f1(x0);(abs(x-x0)>eps) {t++;=x;c;
}=M/(2*m)*abs(x-x0);
}{<<"\n Выберите новое начальное
приближение х0\n";(1);
}
Результат работы программы
Ввести точность eps = 0.001
Ввести абсолютное максимальное значение второй
производной функции правой части уравнения на заданном отрезке M = 93
Ввести абсолютное минимальное значение первой
производной функции правой части на заданном отрезке m = 9
Ввести начальное приближение x0 = 0.2
***Метод Ньютона ***
Абсолютное максимальное значение второй
производной функции правой части уравнения на заданном отрезке M = 93
Абсолютное минимальное значение первой
производной функции правой части на заданном отрезке m = 9
Точность eps = 0.001
Начальное приближение x0 = 0.2
Уравнение методом Ньютона решается
Корень x=0.187439
Количество итераций t=2
Абсолютная погрешность метода R2=0.000827463
Для продолжения нажмите любую клавишу . . .
) Метод простой итерации
Листинг программы на С++
#include<iostream>
#include<cmath>
#include<iomanip>namespace std;
//прототип функции - правая частьf (double x0);
//прототип функции - правая часть - первая
производнаяf1 (double x0);
//прототип функции приведения уравнения к виду
удобному для метода итерацийphi(double x0, double lambda);
//прототип метода простой итерацииpit (double
x0, double eps, double lambda, double q, double& x, int& t, double&
R);main()
{(LC_ALL,"Russian");M1,eps,R3,x3,x0,lambda,q;t3;<<"\n
Ввести точность eps = ";>>eps;<<"\n Ввести абсолютное
максимальное значение первой производной функции правой части на заданном
отрезке M1 = ";>>M1;<<"\n Ввести абсолютное максимальное
значение первой производной функции удобной для метода на заданном отрезке q =
";>>q;<<"\n Ввести начальное приближение x0 =
";>>x0;<<"\n*** Метод простой итерации
***\n";<<"\n Абсолютное максимальное значение первой
производной функции правой части на заданном отрезке M1 = "<<M1;<<"\n
Абсолютное максимальное значение первой производной функции удобной для метода
на заданном отрезке q = "<<q;<<"\n Точность eps =
"<<eps;<<"\n Начальное приближение x0 =
"<<x0;=(-1.0)/M1;(x0,eps,lambda,q,x3,t3,R3);<<"\n Корень
x="<<x3;<<"\n Количество итераций
t="<<t3;<<"\n Абсолютная погрешность метода R3="<<R3;<<endl;
}
//определение функции - правая частьf (double
x0)
{y;=pow((x0+1),3)+log(x0);y;
}
//определение функции - правая часть - первая
производнаяf1 (double x0)
{y;=3*pow((x0+1),2)+1/x0;y;
}
//определение функции приведения уравнения к
виду удобному для метода итерацийphi(double x0, double lambda)
{p;=x0+lambda*f(x0);p;
}
//определение метода простой итерацииpit (double
x0, double eps, double lambda, double q, double& x, int& t, double&
R)
{=phi(x0,lambda);=0;:if
(abs(1+lambda*f1(x0))<1)
{
//cout<<"
\n Метод простой итерации применим
\n";++;=phi(x0,lambda);(abs(x-x0)>eps) {=x;c;
}=1/(1-q)*abs(x-x0);
}cout<<"\n Метод простой итерации не
применим \n";
}
Результат работы программы
Ввести точность eps = 0.001
Ввести абсолютное максимальное значение первой
производной функции правой части на заданном отрезке M1 = 14
Ввести абсолютное максимальное значение первой
производной функции удобной для метода на заданном отрезке q = 0.33429
Ввести начальное приближение x0 = 0.2
*** Метод простой итерации ***
Абсолютное максимальное значение первой
производной функции правой части на заданном отрезке M1 = 14
Абсолютное максимальное значение первой
производной функции удобной для метода на заданном отрезке q = 0.33429
Точность eps = 0.001
Начальное приближение x0 = 0.2
Корень x=0.187855
Количество итераций t=3
Абсолютная погрешность метода R3=0.00134136
Для продолжения нажмите любую клавишу . . .
Листинг программы на MATLAB
clcall
close
allx;(solve('(x+1)^3+ln(x)=0',x))=fzero('(x+1)^3+log(x)',[0.1 0.2])
[x,f,e_flag,inform]=fzero('(x+1)^3+log(x)',[0.1
0.2])
Результат работы программы
.1874=
0.1874=
.1874=
.2204e-016_flag =
=: 0: 6: 8: 'bisection,
interpolation': 'Zero found in the interval [0.1, 0.2]'