Реализации алгоритмов/Метод бисекции: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
перенесено из w:Метод бисекции
 
Нет описания правки
Строка 1: Строка 1:
== На [[w:Си (язык программирования)|C]] ==
== На языке [[w:Си (язык программирования)|C]] ==
<source lang="C">
<source lang="C">
#include <stdio.h> // подключаем к компилятору библиотеку stdio.h;
#include <stdio.h> // подключаем к компилятору библиотеку stdio.h;
Строка 38: Строка 38:


== На языке [[w:Matlab|Matlab]]==
== На языке [[w:Matlab|Matlab]]==
{{чистить}}
* x<sub>n</sub> – начало отрезка по х;
* x<sub>k</sub> – конец отрезка по х;
* x<sub>i</sub> – середина отрезка по х;
* eps – требуемая точность вычислений.

Таким образом, весь алгоритм можно записать следующим образом (в псевдокоде):

# Начало.
# Ввод x<sub>n</sub>, x<sub>k</sub>, eps.
# Если F(x<sub>n</sub>) = 0, то Вывод (корень уравнения – x<sub>n</sub>).
# Если F(x<sub>k</sub>) = 0, то Вывод (корень уравнения – x<sub>k</sub>).
# Пока (F(x<sub>i</sub>) <> 0) и |x<sub>k</sub>-x<sub>n</sub>| > eps повторять:
# x<sub>i</sub> := (x<sub>k</sub>+x<sub>n</sub>)/2;
# если (F(x<sub>n</sub>)*F(x<sub>i</sub>) < 0), то x<sub>k</sub> := x<sub>i</sub>;
# если (F(x<sub>i</sub>)*F(x<sub>k</sub>) < 0), то x<sub>n</sub> := x<sub>i</sub>.
# Вывод (Найден корень уравнения – x<sub>i</sub> точности ε).
# Конец.




Пример реализации алгоритма на языке [[Matlab]]{{Нет АИ|11|11|2010}}
Пример реализации алгоритма на языке [[Matlab]]{{Нет АИ|11|11|2010}}

Версия от 10:58, 4 мая 2012

На языке C

                   
#include <stdio.h>                  // подключаем к компилятору библиотеку stdio.h;  
#include <math.h>                   // подключаем к компилятору библиотеку math.h;
#define EPS 1e-10                   // задаём точность результата 1*10^(-10)

double f(double x) {                // задаём вызываемой функции и аргументу - тип двойной точности;  
   return exp(x) - 2 - x;           // задаём описание функции f(x); 
}

int main ( ) {                      // главная часть программы; 
   double xl = 0, xr = 2, xm, signfxl, signfxm; // задаём переменным тип двойной длины и начальные значения; 
   int n = 0;                       // задаём переменной тип целая и начальное значение; 
   while ( xr - xl > EPS ) {        // пока отрезок больше заданной точности делаем;  
      n = n + 1;                    // прибавляем 1 в счётчик числа проходов (делений на 2, итераций);  
      xm = ( xl + xr ) / 2;         // делим отрезок на две части и вычисляем значение x в середине отрезка;
      signfxl = copysign(1, f(xl)); // придаём единице знак f(xm); 
      signfxm = copysign(1, f(xm)); // придаём единице знак f(xr);
       
      if ( signfxl != signfxm )     // узнаём, находится ли искомый корень в левой части; 
         xr = xm;                   // берём левую часть;
      else                          // иначе искомый корень находится в правой части;
         xl = xm;                   // берём правую часть;                    
   }
   printf ("Root equal: %.10lf\n", (xl + xr)/2 );      // выводим результат
   printf ("Left bound equal: %.10lf\n", xl );         // выводим xl
   printf ("Right bound equal: %.10lf\n", xr );        // выводим xr
   printf ("Numbers of iterations equal: %10i\n", n ); // выводим число проходов (делений на 2, итераций) n
}

В результате прогона программы на устройстве ввода-вывода должен получиться следующий вывод:

Root equal: 1.1461932206
Left bound equal: 1.1461932206
Right bound equal: 1.1461932206
Numbers of iterations equal:         35

На языке Matlab

Пример реализации алгоритма на языке MatlabОшибка выражения: неопознанный символ пунктуации «[»

 clear;
 
 %Интервал
 x_L=1;
 x_R=2;
 length=x_R-x_L;
 %Начальная ошибка
 err=length;
 
 %Итерационный цикл
 while err>1e-3
     %Деление отрезка пополам
     x_M=(x_L+x_R)/2;
     %Нахождение нового интервала
     if tan(x_L)*tan(x_M)<0
         x_R=x_M;
     else
         if tan(x_M)*tan(x_R)<0
             x_L=x_M;
         else
             x_M
             break;
         end
     end
     %Пересчёт ошибки
     err=(x_R-x_L)/length;
 end
 %Вывод результата
 x_M
 err

Результат выполнения вполне ожидаемый

 x_M =
 
     1.5713
 
 
 err =
 
   9.7656e-004