Программирование. Принципы и практика использования C++ Исправленное издание, стр. 204
15.5. Аппроксимация
Рассмотрим еще один небольшой пример построения графика функции: “анимируем” вычисление экспоненты. Наша цель — дать вам почувствовать математические функции, продемонстрировать применение графиков для иллюстрации вычислений, показать фрагменты кода и, в заключение, предупредить о типичных проблемах, связанных с вычислениями.
Один из способов вычисления экспоненты сводится к суммированию степенного ряда.
e<sup>x </sup>= 1 + x + x<sup>2</sup>/2! + x<sup>3</sup>/3! + x<sup>4</sup>/4! + ...Чем больше членов ряда мы вычислим, тем точнее будет значение
e<sup>x</sup>exp0(x) = 0 // нет членовexp1(x) = 1 // один членexp2(x) = 1+x // два члена ; pow(x,1)/fac(1)==xexp3(x) = 1+x+pow(x,2)/fac(2)exp4(x) = 1+x+pow(x,2)/fac(2)+pow(x,3)/fac(3)exp5(x) = 1+x+pow(x,2)/fac(2)+pow(x,3)/fac(3)+pow(x,4)/fac(4)...Каждая функция немного точнее приближает
e<sup>x</sup>pow(x,n)x<sup>n</sup>int fac(int n) // factorial(n); n!{ int r = 1; while (n>1) { r*=n; ––n; } return r;}Альтернативная реализация функции
fac()fac()double term(double x, int n) { return pow(x,n)/fac(n); } // n-й // член рядаИмея функцию
term()ndouble expe(double x, int n) // сумма n членов для x{ double sum = 0; for (int i=0; i<n; ++i) sum+=term(x,i); return sum;}Как построить график этой функции? С точки зрения программиста трудность заключается в том, что наш класс
Functionexpe()nint expN_number_of_terms = 10;double expN(double x){ return expe(x,expN_number_of_terms);}Теперь функция
expN(x)expN_number_of_termsexp()expN()Function real_exp(exp,r_min,r_max,orig,200,x_scale,y_scale);real_exp.set_color(Color::blue);Затем выполним цикл приближений, увеличивая количество членов ряда
nfor (int n = 0; n<50; ++n) { ostringstream ss; ss << " приближение exp; n==" << n ; win.set_label(ss.str()); expN_number_of_terms = n; // следующее приближение: Function e(expN,r_min,r_max,orig,200,x_scale,y_scale); win.attach(e); win.wait_for_button(); win.detach(e);}Обратите внимание на последний вызов
detach(e)eFunctionforeFunctioneWindowedetach(e)WindowНа первом этапе мы получаем окно, в котором нарисованы оси и “настоящая” экспонента (синий цвет).

Как видим, значение
exp(0)1(0,1)(exp0(x)==0)