Приближенное решение уравнения f(x)=0, методом деления пополам (метод бисекции)

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

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

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

Приближенное решение уравнения f(x)=0, методом деления пополам (метод бисекции)

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

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

Теорема Больцано-Коши

Если функция f(x) на концах принимает значения разных знаков: f(a)*f(b)<0, то тогда $ такое значение x=c, что f(c)=0; cÎ[a,b], причем корень будет единственен, если производная на рассматриваемом интервале не меняет знака.

3.  Алгоритм решения

·  Получаем границы отрезка  и требуемую точность вычислений

    • (*) Считаем середину отрезка:
    • Если f(c)*f(a) < 0, то b:=a
    • Если f(c)*f(a) >= 0, то b:=c
    • Если f(c) = 0, то проверяем знаки на концах отрезка [c-eps/2, c+eps/2]. Если функция принимает значения разных знаков, то корень найден. Если нет, то произошла ошибка, и программа аварийно выходит.
    • Перейти к шагу (*), если длина нового отрезка  , или значение функции в точке «c» - больше заданной точности.
    • Вывести найденное значение корня

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

#include "stdafx.h"

#include <math.h>

#include <conio.h>

#define FALSE 0

#define TRUE 1

// Tested with params

// [4;5]

// 0.00001

float f (float);

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

{

              float a,b,c,epsilon;

              char blnError = FALSE;

              printf("Нахождение корня функции f(x) = 0 на отрезке [n1,n2] \nметодом деления пополам (бисекции)\n");

              printf("Вычисления производятся для функции f(x)=tg(ax)-bx, \nпри a=0.9464 и b=1.3825\n");

              printf("Введите границы отрезка для нахождения корня\n");

              printf("Левая граница отрезка: "); scanf("%f",&a);

              printf("Правая граница отрезка: "); scanf("%f",&b);

              printf("Точность вычислений: ");  scanf("%f",&epsilon);

              do

                {

                            c=(a+b)/2;

                            ((f(c)*f(a)<0)?b:a)=c;

                            if (f(c)==0)

                            {

                                           printf ("Значение функции в точке %f равно нулю\n",c);

                                           blnError = (f(c-epsilon/2)*f(c+epsilon/2)<0)?FALSE:TRUE;

                                           break;

                            }

              }

              while (fabs(f(c))>epsilon || fabs(b-a)>epsilon);

              if (blnError)

              {

                            printf ("Однако, на концах отрезка [%f-%f,%f+%f] \nфункция не принимает значения разных знаков\n",c,epsilon,c,epsilon);

              }

              else

              {

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

              }

              getch();

              return 0;

}

float f (float x)

{

              const float a = 0.9464; const float b = 1.3825;

              return tan(a*x)-b*x;

};


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

Рассмотрим работу программы на тестовом примере, решение которого известно:

Уравнение: (x-1)(x+1) = 0

Решение: x=3; y=-1

а)

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

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

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

Значение функции в точке -1.000000 равно нулю

Значение корня: -1.000000

              б)

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

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

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

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

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

Уравнение: tg (ax) – bx = 0                         a=0.9464, b=1.3825

На отрезке - функция имеет вид:

Рассмотрим интервал [0.5, 1.5], на котором функция удовлетворяет условиям Больцано-Коши.

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

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

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

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

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

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

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

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