Язык Си в примерах/Корень уравнения: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
 
мНет описания правки
Строка 1:
 
Рассмотрим уравнение, которое не имеет явной формулы для корня:
<math>e^x = x - 2.</math>
Строка 12 ⟶ 11 :
#include <math.h>
#define EPS 1e-10
double f(double x) {
{
return exp(x) - 2 - x;
}
voidint main() {
{
double l = 0, r = 2, c;
while( r - l > EPS ) {
{
c = ( l + r ) / 2;
if( f(c) * f(r) < 0 ) l = c;
else r l = c;
else
r = c;
}
printf ("%.10lf\n", (l + r)/2 );
Строка 33 ⟶ 31 :
bash$ gcc -lm root.c -o root
 
В библиотеке <tt>mlib</tt>, в частности, определена функция <tt>exp</tt>, вычисляющая экспоненту, а также многие другие математические функции: тригонометричекие (<tt>sin</tt>, <tt>cos</tt>, <tt>asin</tt>, <tt>acos</tt>, <tt>tan</tt>, ...), корень (<tt>sqrt</tt>), степень (<tt>pow</tt>), логарифм (<tt>log</tt>), ...
 
Директива <tt>#define EPS 1e-10</tt> означает: везде, где встречается комбинация EPS
Строка 39 ⟶ 37 :
с которой мы хотим найти корень.
 
Алгоритм вычисления корня основан нена [[:w:Метод деления попалам|методе деления пополам]].
А именно, пусть мы значемзнаем, что корень функции находится между
<tt>l=0</tt> и <tt>r=2</tt>. Найдем середину <tt>c</tt> отрезкапомежутка <tt>[l, r)</tt>.
Корень находится на одном из промежутков: либо на <tt>[l,c)</tt>,
либо на <tt>[с, r)</tt>, а именно на том, значение функции на концах которого
имеет разные знаки (вспомните теорему Ролля про непрерывную функцию из курса мат. анализа).
Выберем нужный из двух отрезков и применим к нему тетакие же рассуждения.
Будем заниматьсяосуществлять делениемделение попалам, пока размер отрезкапромежутка не станет меньше необходимой точности.
необходимой точности.