реклама на сайте
подробности

 
 
> Интеграл, непонятен один момент
Zelepuk
сообщение Dec 14 2012, 08:53
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Хочу найти функцию вычисления определённого интеграла для произвольного массива чисел.
В сети полно примеров взятия интеграла, например:

CODE
double integral(a, b, f, eps)
double a, b; /* концы отрезка */
double eps; /* требуемая точность */
double (*f)(); /* подынтегральная функция */
{
register long i;
double fab = (*f)(a) + (*f)(cool.gif; /* сумма на краях */
double h, h2; /* шаг и удвоенный шаг */
long n, n2; /* число точек разбиения и оно же удвоенное */
double Sodd, Seven; /* сумма значений f в нечетных и в
четных точках */
double S, Sprev;/* значение интеграла на данной
и на предыдущей итерациях */
double x; /* текущая абсцисса */

niter = 0;
n = 10L; /* четное число */
n2 = n * 2;

h = fabs(b - a) / n2; h2 = h * 2.0;

/* Вычисляем первое приближение */
/* Сумма по нечетным точкам: */
for( Sodd = 0.0, x = a+h, i = 0;
i < n;
i++, x += h2 )
Sodd += (*f)(x);

/* Сумма по четным точкам: */
for( Seven = 0.0, x = a+h2, i = 0;
i < n-1;
i++, x += h2 )
Seven += f(x);

/* Предварительное значение интеграла: */
S = h / 3.0 * (fab + 4.0 * Sodd + 2.0 * Seven );
do{
niter++;
Sprev = S;

/* Вычисляем интеграл с половинным шагом */
h2 = h; h /= 2.0;
if( h == 0.0 ) break; /* потеря значимости */
n = n2; n2 *= 2;

Seven = Seven + Sodd;
/* Вычисляем сумму по новым точкам: */
for( Sodd = 0.0, x = a+h, i = 0;
i < n;
i++, x += h2 )
Sodd += (*f)(x);

/* Значение интеграла */
S = h / 3.0 * (fab + 4.0 * Sodd + 2.0 * Seven );

} while( niter < 31 && fabs(S - Sprev) / 15.0 >= eps );
/* Используем условие Рунге для окончания итераций */

return ( 16.0 * S - Sprev ) / 15.0 ;
/* Возвращаем уточненное по Ричардсону значение */
}


Непонятно следущее: f - указывает на подынтегральную функцию. Математически это понятно. Но в Си же это подпрограмма! Я наверное принципиально ен понимаю чего-то но как можно интеграл от подпрограммы взять? или программа должна возвращать указатель на массив?
я же надеялся найти реализацию где в качестве указателя будет указатель на массив, поскольку функция представлена в виде набора отсчётов (массива) от a до b.

Заранее спасибо за разъяснения.

Сообщение отредактировал Zelepuk - Dec 14 2012, 09:38
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Dec 14 2012, 13:13
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



А кстати, а чего это народ функцию от указателя так вычурно вычисляет?
S += (*f)(х);
На мой взгляд (а мои взгляды могут расходиться со взглядами компилятора sm.gif), такую функцию следует вызывать как обычную
S += f(х);
Тем более что прецедент уже есть - существует два разных способа объявления массива:
int array[100], *parray=array;
И тем не менее, обоими массивами пользуются одинаково, когда достают из них элементы:
S += array[x];
или
S += parray[x];
а вовсе не (*parray)[x];
И все только потому, что array - тоже указатель, только константный. А, значит, и оператор [] будет их разыменовывать правильно в обоих случаях.

По аналогии с этим, и функцию по указателю можно вызывать напрямую, как f(x), поскольку обычная функция (не указатель) тоже является указателем на функцию, только константным. Значит, и оператор () тоже должен работать в обоих случаях одинаково.
Или я не права?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 14 2012, 13:39
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Xenia @ Dec 14 2012, 17:13) *
Или я не права?
не совсем. попробуйте двумерный массив.
Ну или посмотрите что вам вернёт sizeof(array1) и что sizeof(array2) для таких вот случаев
Код
uint8_t array1[10];
uint8_t array2[2][5];


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 14 2012, 13:45
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(demiurg_spb @ Dec 14 2012, 17:39) *
не совсем. попробуйте двумерный массив.
Ну или посмотрите что вам вернёт sizeof(array1) и что sizeof(array2) для таких вот случаев
Код
uint8_t array1[10];
uint8_t array2[2][5];


Ну так я же не просила вас вызывать двухмерную функцию. sm.gif
Речь шла о том, что оператор [] приложим к указателю, так же как и оператор (). Оба они требуют, чтобы слева от них стоял указатель, хоть бы и вычисляемый. Т.е. я не за идентичность указателей ратовала, а за единообразие выполнения операторов "скобочки". А именно, в выражении f() скобочки должны интерпретировать f, как указатель (в данном случае на функцию), а не как-то иначе. Зачем же тогда f предварительно разыновывать? Ведь если имя массива (без скобочек) это указатель, то и имя фукции без скобочек тоже должно быть указателем. А чем же ещё-то?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Zelepuk   Интеграл   Dec 14 2012, 08:53
- - MrYuran   double f() - это функция, возвращающая значение в ...   Dec 14 2012, 09:44
|- - Zelepuk   Цитата(MrYuran @ Dec 14 2012, 13:44) doub...   Dec 14 2012, 09:52
|- - xemul   Цитата(Zelepuk @ Dec 14 2012, 13:52) непо...   Dec 14 2012, 10:20
|- - DRUID3   Цитата(Zelepuk @ Dec 14 2012, 11:52) Я по...   Dec 14 2012, 10:21
|- - Палыч   Цитата(Zelepuk @ Dec 14 2012, 13:52) непо...   Dec 14 2012, 10:22
- - demiurg_spb   Цитата(Zelepuk @ Dec 14 2012, 12:53) Хочу...   Dec 14 2012, 11:24
|- - DRUID3   Цитата(demiurg_spb @ Dec 14 2012, 13:24) ...   Dec 14 2012, 11:35
||- - demiurg_spb   Цитата(DRUID3 @ Dec 14 2012, 15:35) Точно...   Dec 14 2012, 11:42
|- - Xenia   Цитата(demiurg_spb @ Dec 14 2012, 15:24) ...   Dec 14 2012, 11:51
|- - demiurg_spb   Цитата(Xenia @ Dec 14 2012, 15:51) Так я ...   Dec 14 2012, 11:58
- - _Ivana   Не, ну можно поискать приключений, вылить воду и с...   Dec 14 2012, 12:10
|- - Xenia   Цитата(_Ivana @ Dec 14 2012, 16:10) Не, н...   Dec 14 2012, 12:38
- - _Ivana   А кто его знает, с какой частотой у автора идут от...   Dec 14 2012, 12:56
- - ReAl   Цитата(Xenia @ Dec 14 2012, 15:45) А имен...   Dec 14 2012, 17:09


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016