Численное нахождение корня функции

Выполнение отделения корней для заданной функции. Описание уточнения корней с использованием метода дихотомии, Ньютона, простой итерации. Выявление абсолютной погрешности методов. Создание листинга программ. Рассмотрение результатов работы программ.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 19.04.2015
Размер файла 16,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Минобрнауки России

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

"Нижегородский государственный технический университет

им. Р.Е. Алексеева"

Арзамасский политехнический институт (филиал)

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

по дисциплине "Численные методы"

Вариант №6

Выполнили:

студентки гр. АСПМ 12-1

Кузнецова Ольга

Минеева Ирина

Архипова Екатерина

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

Эварт Т.Е.

Арзамас

2015 г.

Задание №1

корень дихотомия ньютон программа

Выполнить отделение корней для функции

Выполнить уточнение корней с точностью 0,001, используя метод дихотомии, метод Ньютона, метод простой итерации.

Решение.

1) Метод дихотомии

Листинг программы на С++

#include<iostream>

#include<cmath>

#include<iomanip>

using namespace std;

//прототип функции - правая часть

double f (double x0);

//прототип функции - метод половинного деления

double pol(double a, double b, double eps, int& t);

void main()

{

setlocale(LC_ALL,"Russian");

double a,b,eps,R1,x1;

int t1;

cout<<"\n Ввести начало отрезка а = ";

cin>>a;

cout<<"\n Ввести конец отрезка b = ";

cin>>b;

cout<<"\n Ввести точность eps = ";

cin>>eps;

cout<<"\n*** Метод дихотомии ***\n";

cout<<"\n Начало отрезка а = "<<a;

cout<<"\n Конец отрезка b = "<<b;

cout<<"\n Точность eps = "<<eps;

x1=pol(a,b,eps,t1);

R1=(b-a)/(pow(2.0,t1));

cout<<"\n Корень x="<<x1;

cout<<"\n Количество итераций t="<<t1;

cout<<"\n Абсолютная погрешность метода R1="<<R1;

cout<<endl;

}

//определение функции - правая часть

double f (double x0)

{

double y;

y=pow((x0+1),3)+log(x0);

return y;

}

//определение функции - метод половинного деления

double pol(double a, double b, double eps, int& t)

{

double x0;

t=1;

c:x0=(a+b)/2;

if (f(x0)==0) goto c1;

else if(f(a)*f(x0)<0) b=x0;

else a=x0;

if (abs(b-a)>2*eps) {

t++;

goto c;

}

c1: 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

Для продолжения нажмите любую клавишу . . .

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

Листинг программы на С++

#include<iostream>

#include<cmath>

#include<iomanip>

using namespace std;

//прототип функции - правая часть

double f (double x0);

//прототип функции - правая часть - первая производная

double f1 (double x0);

//прототип функции - правая часть - вторая производная

double f2 (double x0);

//прототип функции - метод Ньютона

void newton(double x0, double eps,double M, double m,double& x, int& t, double& R);

void main()

{setlocale(LC_ALL,"Russian");

double M,m,eps,R2,x2,x0;

int t2;

cout<<"\n Ввести точность eps = ";

cin>>eps;

cout<<"\n Ввести абсолютное максимальное значение второй производной функции правой части уравнения на заданном отрезке M = ";

cin>>M;

cout<<"\n Ввести абсолютное минимальное значение первой производной функции правой части на заданном отрезке m = ";

cin>>m;

cout<<"\n Ввести начальное приближение x0 = ";

cin>>x0;

cout<<"\n***Метод Ньютона ***\n";

cout<<"\n Абсолютное максимальное значение второй производной функции правой части уравнения на заданном отрезке M = "<<M;

cout<<"\n Абсолютное минимальное значение первой производной функции правой части на заданном отрезке m = "<<m;

cout<<"\n Точность eps = "<<eps;

cout<<"\n Начальное приближение x0 = "<<x0;

newton(x0,eps,M,m,x2,t2,R2);

cout<<"\n Корень x="<<x2;

cout<<"\n Количество итераций t="<<t2;

cout<<"\n Абсолютная погрешность метода R2="<<R2;

cout<<endl;

}

//определение функции - правая часть

double f (double x0)

{

double y;

y=pow((x0+1),3)+log(x0);

return y;

}

//определение функции - правая часть - первая производная

double f1 (double x0)

{

double y;

y=3*pow((x0+1),2)+1/x0;

return y;

}

//определение функции - правая часть - вторая производная

double f2 (double x0)

{

double y;

y=6*(x0+1)-(1/pow(x0,2));

return y;

}

//определение функции - метод Ньютона

void newton(double x0, double eps,double M, double m,double& x, int& t, double& R)

{

if (f(x0)*f1(x0)>0)

{

cout<<"\n Уравнение методом Ньютона решается\n";

t=1;

c:x=x0-f(x0)/f1(x0);

if (abs(x-x0)>eps) {t++;

x0=x;

goto c;

}

R=M/(2*m)*abs(x-x0);

}

else {

cout<<"\n Выберите новое начальное приближение х0\n";

exit(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

Для продолжения нажмите любую клавишу . . .

3) Метод простой итерации

Листинг программы на С++

#include<iostream>

#include<cmath>

#include<iomanip>

using namespace std;

//прототип функции - правая часть

double f (double x0);

//прототип функции - правая часть - первая производная

double f1 (double x0);

//прототип функции приведения уравнения к виду удобному для метода итераций

double phi(double x0, double lambda);

//прототип метода простой итерации

void pit (double x0, double eps, double lambda, double q, double& x, int& t, double& R);

void main()

{

setlocale(LC_ALL,"Russian");

double M1,eps,R3,x3,x0,lambda,q;

int t3;

cout<<"\n Ввести точность eps = ";

cin>>eps;

cout<<"\n Ввести абсолютное максимальное значение первой производной функции правой части на заданном отрезке M1 = ";

cin>>M1;

cout<<"\n Ввести абсолютное максимальное значение первой производной функции удобной для метода на заданном отрезке q = ";

cin>>q;

cout<<"\n Ввести начальное приближение x0 = ";

cin>>x0;

cout<<"\n*** Метод простой итерации ***\n";

cout<<"\n Абсолютное максимальное значение первой производной функции правой части на заданном отрезке M1 = "<<M1;

cout<<"\n Абсолютное максимальное значение первой производной функции удобной для метода на заданном отрезке q = "<<q;

cout<<"\n Точность eps = "<<eps;

cout<<"\n Начальное приближение x0 = "<<x0;

lambda=(-1.0)/M1;

pit(x0,eps,lambda,q,x3,t3,R3);

cout<<"\n Корень x="<<x3;

cout<<"\n Количество итераций t="<<t3;

cout<<"\n Абсолютная погрешность метода R3="<<R3;

cout<<endl;

}

//определение функции - правая часть

double f (double x0)

{

double y;

y=pow((x0+1),3)+log(x0);

return y;

}

//определение функции - правая часть - первая производная

double f1 (double x0)

{

double y;

y=3*pow((x0+1),2)+1/x0;

return y;

}

//определение функции приведения уравнения к виду удобному для метода итераций

double phi(double x0, double lambda)

{

double p;

p=x0+lambda*f(x0);

return p;

}

//определение метода простой итерации

void pit (double x0, double eps, double lambda, double q, double& x, int& t, double& R)

{

x=phi(x0,lambda);

t=0;

c:if (abs(1+lambda*f1(x0))<1)

{

//cout<<"

\n Метод простой итерации применим \n";

t++;

x=phi(x0,lambda);

if (abs(x-x0)>eps) {

x0=x;

goto c;

}

R=1/(1-q)*abs(x-x0);

}

else 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

clc

clear all

close all

syms x;

double(solve('(x+1)^3+ln(x)=0',x))

z=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])

Результат работы программы

ans =

0.1874

z =

0.1874

x =

0.1874

f =

-2.2204e-016

e_flag =

1

inform =

intervaliterations: 0

iterations: 6

funcCount: 8

algorithm: 'bisection, interpolation'

message: 'Zero found in the interval [0.1, 0.2]'

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.