Численное нахождение корня функции
Выполнение отделения корней для заданной функции. Описание уточнения корней с использованием метода дихотомии, Ньютона, простой итерации. Выявление абсолютной погрешности методов. Создание листинга программ. Рассмотрение результатов работы программ.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 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
Подобные документы
Способы отделения корней. Решение задачи методами Ньютона уточнения корней и простых итераций. Формула нахождения погрешностей. Геометрическая интерпретация методов. Составление блок-схем и текстов программ. Результаты их работы на тестовом примере.
курсовая работа [3,1 M], добавлен 15.06.2013Решение нелинейного уравнения. Отделение корней - исследование количества, характера и расположения корней, нахождение их приближенных значений. Уточнение корня до заданной степени точности. Численное интегрирование и квадратурные формулы прямоугольников.
курсовая работа [51,9 K], добавлен 04.02.2009Нахождение с заданной погрешностью корней уравнения. Оценка скорости сходимости. Нахождение промежутка, в котором содержится какой-либо корень уравнения для методов итераций и Ньютона. Разработка текста компьютерных программ для решения данных уравнений.
лабораторная работа [253,9 K], добавлен 19.12.2012Описание метода простой итерации. Численное интегрирование по правилу прямоугольника. Программа уточнения корня. Назначение и отличительные особенности WinRAR, его ограничения. Режимы управления файлами и архивами. Использование контекстных меню.
курсовая работа [591,8 K], добавлен 10.01.2016Описание методов дихотомии (половинного деления) и касательных. Их применение для решения нелинейных уравнений. Графическое отделение корней. Блок-схемы алгоритмов. Тексты (листинги) программ на языке Delphi. Тестовый пример решения задачи с помощью ЭВМ.
курсовая работа [944,6 K], добавлен 15.06.2013Определение недостатков итерационного численного способа нахождения корня заданной функции (метод Ньютона). Рассмотрение основ математического и алгоритмического решения поставленной задачи, ее функциональной модели, блок-схемы и программной реализации.
курсовая работа [364,8 K], добавлен 25.01.2010Изучение численных методов решения нелинейных уравнений, используемых в прикладных задачах. Нахождение корня уравнения методом простой итерации и методом касательных (на примере уравнения). Отделение корней графически. Программная реализация, алгоритм.
курсовая работа [1,7 M], добавлен 15.06.2013Сравнительный анализ итерационных методов решения нелинейных алгебраических и трансцендентных уравнений. Простейший алгоритм отделения корней нелинейных уравнений. Метод половинного деления. Геометрический смысл метода Ньютона. Метод простой итерации.
реферат [95,0 K], добавлен 06.03.2011Исследование количества, характера и расположения корней. Определение их приближенных значений итерационными методами: половинного деления (дихотомии) и хорд. Тексты программ. Решение уравнений на языках программирования Borland Delfi и Turbo Pascal.
курсовая работа [500,3 K], добавлен 15.06.2013Принципы разработки математических моделей, алгоритмов и программ. Составление программы вычисления функции с использованием нестандартных функций. Нахождение значения корней нелинейного уравнения по методу касательных. Программа для вычисления интеграла.
курсовая работа [568,3 K], добавлен 07.03.2015