Реализации алгоритмов/Метод бисекции: различия между версиями
Содержимое удалено Содержимое добавлено
Maxal (обсуждение | вклад) перенесено из w:Метод бисекции |
Maxal (обсуждение | вклад) Нет описания правки |
||
Строка 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