Приближенное решение уравнения f(x)=0 методом Ньютона (Лабораторная работа № 3 (5-1))

Страницы работы

Содержание работы

ЛАБОРАТОРНАЯ РАБОТА № 3 (5-1)

Приближенное решение уравнения f(x)=0 методом Ньютона

  1. Постановка задачи.
     

Составить и отладить программу на языке Си, реализующую метод Ньютона для решения уравнения общего вида, с произвольной функцией, имеющей на [a;b] корень.

  1. Теоретическое обоснование метода

Метод Ньютона  для решения уравнений вида (1) для произвольной функции f(x) состоит  в построении итерационной последовательности:


 

сходящейся  при  n→∞ к корню уравнения.

Метод эффективно применим, если подобрано хорошее начальное приближение xo  и гарантирует высокую скорость сходимости.

Теорема: (Достаточные условия сходимости).

Пусть функция  f(x) определена и дважды непрерывно дифференцируема, причем производные f’(x) и f’’(x) сохраняют знаки на отрезке [a,b] (т.е. на этом отрезке есть корень),

тогда  исходя из начального приближения xo , удовлетворяющего условию

f(xo)*f’’(xo)>0  итерационный процесс (*) сходится к единственному на [a,b] корню ξ :  f(ξ)=0, ξ Î [a,b].


  1. Текст программы

#include "stdafx.h"

#include <conio.h>

#include <math.h>

const float a=2.113f;

const float b=-6.44f;

const float c=-3.19f;

const float d=15.13f;

const float m=2.41064f; const float M=20.0828f;

float f (float);

float df (float);

int main(int argc, char* argv[])

{

         float x0,xk,a,b,epsilon;

         printf("Нахождение корня функции f(x) = 0 с начальным приближением x0 \nметодом Ньютона\n");

         printf("Вычисления производятся для функции f(x)=ax^3+bx^2+cx+d, при \na=2.113\nb=-6.44\nc=-3.19\nd=15.13\n");

         printf("Левая граница отрезка: ");

         scanf("%f",&a);

         printf("Правая граница отрезка: ");

         scanf("%f",&b);

         printf("Начальное приближение: ");

         scanf("%f",&x0);

         printf("Точность вычислений: ");

         scanf("%f",&epsilon);

         xk=x0;

         do

         {

                           x0=xk;

                           xk=x0-(f(x0)/df(x0));

         }

         while (fabs(xk-x0)>sqrt(fabs(2.f*epsilon*m/M)));

         printf("Значение корня: %f\n",x0);

         getch();

         return 0;

}

float f (float x)

{

         return (a*x*x*x + b*x*x + c*x + d);

}

float df (float x)

{

         return (3*a*x*x + 2*b*x + c);

}


  1. Тестовый пример

Рассмотрим тестовый пример, решение которого может быть легко найдено аналитически.

y(x) = (x-1)(x+1)

Рассмотрим отрезок [0.6, 1.6]

Поведение функции, ее первой и второй производных на этом отрезке:

Рассмотрим  и на этом отрезке

 = 2x = 2

Итак, величина


для данного отрезка может быть выбрана равной 1.2

А величина:

равна 2.

Тогда, при выбранной точности 0.00001 для окончания итерационного процесса следует использовать

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

Левая граница отрезка: 0.6

Правая граница отрезка: 1.6

Начальное приближение: 0.6

Точность вычислений: 0.00001

Значение корня: 1.000031


  1. Расчетный пример

Для функции вида:

             

a=2.113, b= -6.44,  c= -3.19, d= 15.13;       

Выберем отрезок, на котором заданная функция имеет ровно один корень.

Это отрезок [2.4 , 2.6]

Рассмотрим первую и вторую производные заданной функции на этом отрезке, для выбора величин M и m.

Аналитическое представление второй производной: 12.678x – 12.88

Аналитическое представление первой производной: 6.339x2 – 12.88x – 3.19

m =  2.41064

M= 20.0828

Новая величина точности будет равна: .1549419600e-2

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

Левая граница отрезка: 2.4

Правая граница отрезка: 2.6

Начальное приближение: 2.4

Точность вычислений: 0.00001

Значение корня: 2.518090

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
76 Kb
Скачали:
0