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

Содержимое удалено Содержимое добавлено
мНет описания правки
Нет описания правки
Строка 1:
{{Содержание «Язык Си в примерах»}}
 
'''Задача:''' Рассмотрим [[w:Трансцендентное уравнение|трансцендентное уравнение]], которое не имеет явной формулы для корня:
<math>e^x = x - 2.\,\!</math>
С помощью компьютера можнонеобходимо найти положительный корень этого уравнения с точностью до 10 знаков
после запятой, то есть с погрешностью не более <math>10^{-10}\,\!</math>.
 
 
Вот решение этой задачи:
Строка 29 ⟶ 28 :
 
 
При компиляции этой программы с помощью GCC следует указать опциеюопцию <tt>-lm</tt>, чтобыкоторая указывает что при линковщиккомпоновке программы необходимо подключилподключить библиотеку <tt>mliblibm</tt> с математическими функциями:
 
bash$ gcc -lm root.c -o root
Строка 35 ⟶ 34 :
В библиотеке <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
заменить её на число <tt>1e-10</tt>, то есть <math>1\cdot 10^{-10}\,\!</math>. Число <tt>EPS</tt> &mdash; это погрешность,
с которой мы хотим найти корень.
 
Алгоритм вычисления корня основан на [[:w:Метод деления попалам|методе деления пополам]].
А именно, пусть мы знаем, что корень функции находится между
<tt>l = 0</tt> и <tt>r = 2</tt>. Найдем середину <tt>c</tt> помежутка <tt>[l, r)</tt>.
Корень находится на одном из промежутков: либо на <tt>[l, c)</tt>,
либо на <tt>[с, r)</tt>, а именно, на том, значение функции на концах которого
имеет разные знаки (вспомните [[w:Теорема Ролля|теорему Ролля]] про непрерывную функцию из курса мат. анализа).
Выберем нужный из двух отрезков и применим к нему такие же рассуждения.
Будем осуществлять деление попалам, пока размер промежутка не станет меньше необходимой точности.
Строка 62 ⟶ 61 :
Для этого нужно научится передавать функцию в качестве аргумента --- это возможно, и совсем несложно:
 
/* Универсальная функция вычислениевычисления корня уравнения f(x) = 0 */
#include <stdio.h>
#include <math.h>
Строка 77 ⟶ 76 :
return l;
}
double f1(double x) {return cos(x) - 3 * x; }
double f2(double x) {return exp(x) - x - 2; }
int main() {