Правильно, только в таком случае либо пользуйтесь ей только сначала для перевода пределов интегрирования, либо к dx тоже применяйте эту функцию.
Ах вот где собака зарыта, спасибо
помогло, заодно узнал как передаются указатели на функции.
Возникает вопрос, а какую точность даёт данный метод
Составил программу, которая считает интегралом и всеми остальными методами. Данные расходятся
#include "math.h"
#include <stdio.h>
#define a 149597887.5 //большая полуось
#define e 0.016710219 //Эксцентринитет
#define b (a*sqrt(1-square(e)))
#define c (4*square(b)/square(a))
double GtoRs(double val)
//функция пересчёта градусов в радианы
{
return val*M_PI/180;
}
double square(double val){
// возведение в квадрат
return val*val;
}
double Ellipse(double x){
//подинтегральная функция
// вот формула http://upload.wikimedia.org/wikipedia/r ... 963f66.png
return a*sqrt(1-square(e)*square(cos(GtoRs(x))));
}
double Ellipse2(double x){
//подинтегральная функция
// вот формула http://upload.wikimedia.org/wikipedia/r ... 963f66.png
return c*(square(x)/(1-square(x)));
}
double Integral(double right,double left,int pointcount, double(*func)(double) ){
if(right<left){
//идём от меньшего к большему
double temp = right;
right = left;
left = temp;
}
double dx = (right -left)/pointcount;// вычисляем шаг(ширину нижнего края прямоугольника)
double Summ=0;// изначально площать нулевая.
while(left<right){
Summ = Summ + dx*func(left);// умножаю длинну нижнего края прямоугольника на его высоту для получения площади.
left+=dx;
}
return Summ;
}
double formula1(){
//http://upload.wikimedia.org/wikipedia/ru/math/a/3/4/a3407b6378582dbf9ab44aba5955dfaa.png
return 4*(M_PI*a*b + square(a-b))/(a+b);
}
double formula2(){
//http://upload.wikimedia.org/wikipedia/ru/math/2/1/0/2107d4515d94590fd48be322a32efd2a.png
double x = log(2)/log(M_PI/2);
return 4*pow((pow(a,x)+pow(b,x)),1/x);
}
double formula3(){
//http://upload.wikimedia.org/wikipedia/ru/math/3/f/d/3fd05349758aa3694cb822ce17ef7af0.png
return M_PI*(3*(a+b)-sqrt((3*a+b)*(a+3*b)));
}
int main(){
double res = Integral(GtoRs(0),GtoRs(360),3600,&Ellipse);//интеграл в полярных координатах, в качестве парпметра - угол, от 0 до 360. точность до 1 градуса
printf("with integral: %f\n",res);
res = formula1();
printf("first formula eps <=> 063%% : %f\n",res);
res = formula2();
printf("second formula eps < then in first formula 2 times : %f\n",res);
res = formula3();
printf("Ramanujan formula: %f\n",res);
return 1 ;
}
Вывод:
- with integral: 940081593.800145
- first formula eps <=> 063% : 939885629.415544
- second formula eps < then in first formula 2 times : 939885629.389084
- Ramanujan formula: 939885629.309072
-
-
- ------------------
- (program exited with code: 1)
- Press return to continue
Брякнуло в голову, а чуете попенцией. Парадокс, однако.
Вполне достаточное приближение для длины дуги Земли даёт формула:
. Время в секундах, длина в километрах. Я сам всегда так считаю и репа не воспаляется.
Не сильно понял ваш метод. Что там на счёт времени в секундах? Какие мне задавать t1 и t2?
-- 08.08.2012, 00:18 --Правильно, только в таком случае либо пользуйтесь ей только сначала для перевода пределов интегрирования, либо к dx тоже применяйте эту функцию.
Да. Нужно тогда вместо
писать
, а перед интегралом тогда появится дополнительный множитель
Тут что-то вы намудрили. Я решил просто сходу давать left и right в радианах и dx тогда тоже вычисляется в радианах. А добавление перед Интегралом
всё возвращает на круги своя.