Читайте также: |
|
В языке Си функция не является переменной, но можно определить указатель на функцию и работать с ним как с обычной переменной: присваивать, размещать в массиве, передавать в качестве параметра функции, возвращать как результат из функции. Например, объявление double (*f) (double x, double y); определяет f как указатель на функцию, имеющую два аргумента типа double и возвращающую значение типа double. Здесь скобки вокруг имени указателя (*f) важны, запись double *f (double x, double y); определяет f как функцию, с двумя аргументами типа double, которая возвращает указатель на double.
Рассмотрим задачу нахождения максимального значения функции y = f (x) на отрезке [ a, b ]. Применим метод перебора для решения этой задачи. Выберем на отрезке [ a, b ] n точек, расположенных на одинаковом расстоянии
друг от друга. Их координаты можно вычислить по формуле .
В каждой из этих точек вычислим значение функции и выберем среди этих значений максимальное.
Большая часть работы описанного алгоритма поиска максимума не зависит от вида функции, максимум которой нужно найти, поэтому хотелось бы написать программу, пригодную для поиска максимума любой функции. Это можно сделать, если алгоритм поиска максимума реализовать в виде функции, в качестве аргумента которой будет передаваться указатель на функцию для вычисления f (x).
/* maxfun: возвращает максимальное значение функции, значения которой вычисляются с помощью функции, заданной указателем f*/
double maxfun(double (*f)(double), double a, double b, int n)
/* f – указатель на функцию с одним аргументом типа double и возвращающую значение типа double;
a, b – границы отрезка определения функции; n – число точек на отрезке, в которых вычисляется функция. */
{ double dx, fx, max;
dx = (b - a)/(n - 1); //Расстояние между узлами
max = f(a); //Предполагаем, что максимум на левой границе
while((a+=dx) <= b){
fx = f(a); //Значение функции в текущей точке
if(fx > max)
max = fx; }
return max;
}
#include <math.h>
#include <stdio.h>
double erf(double); //Прототип некоторой функции
void main()
{//Исследуем библиотечную функцию синус
cout << "\nmax sin(x) при 0 < x < Pi = " << maxfun(sin, 0, M_PI, 50);
//Исследуем функцию norm
cout << "\nmax norm(x) при -2 < x < 2 = " << maxfun(norm, -2, 2, 50);
}
double norm(double x)
{ return exp(-x*x)/sqrt(2 * M_PI);}
Дата добавления: 2015-07-08; просмотров: 438 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Указатели и массивы. Адресная арифметика. | | | А) в разделении труда между специалистами, способными более эффективно выполнить работу |