Форум программистов, компьютерный форум, киберфорум
Численные методы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 2
1

Найти площадь поверхности сегмента эллипсоида

02.08.2015, 15:04. Показов 5285. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Уже неделю не могу найти ошибку в расчете интеграла численными методами.
Буду крайне признателен за любую помощь профессионалов.

Задача заключается в том, чтобы найти площадь части поверхности эллипсоида с радиусами a, b, c, для x больше некоторой заданной точки g.
В интернете я нашел формулу (см. https://www.math.auckland.ac.n... ts/539.pdf - формула 49):
Найти площадь поверхности сегмента эллипсоида

Е(m) – полный эллиптический интеграл второго рода.
Выкладки по выводу несложные и вроде я не нашел ошибок. Но так как я не математик, то не исключаю, что ошибка все-таки может быть. Например, могут быть особенности, связанные с тем, что за пределами границ интервала подинтегральная функция не существует: может быть в этом случае не работает приведение двойного интеграла к повторному.
Проблема в том, что когда я численно пытаюсь взять интеграл, то программа выдает некорректную цифру. Я тестировал следующим образом. Есть общеизвестная формула площади целого эллипсоида:
Найти площадь поверхности сегмента эллипсоида

F – неполный эллиптический интеграл первого рода
E – неполный эллиптический интеграл второго рода
Соответственно, половина площади поверхности эллипсоида, рассчитанного по общей формуле, должна быть равна значению первого интеграла на промежутке от 0 до 1.
В программе я рассчитал площадь половины эллипсоида с радиусами (2, 1.2, 0.7) по формуле (2). Она сходится со значением, указанным в https://www.math.auckland.ac.n... ts/539.pdf - с. 17 table 2 и равна 10.21169524241981.
Затем я рассчитал значение интеграла (1) численно в C++ (метод Гаусса-Кронрода).
Получается неправильное значение 11.1301889.
Я подумал, что может быть метод Гаусса не подходит и использовал метод Ромберга. Однако получил то же неправильное значение.
Пробовал считать в других библиотеках. Результат тот же.
При этом в https://www.math.auckland.ac.n... ts/539.pdf автором указано, что формулы тестировались методом Ромберга и получены абсолютно точные результаты (с. 17, см. Table 2).
Я заметил, что в случае сфероида (когда b=c) численные методы выдают правильное значение.
На всякий случай прилагаю код на С++.
Код на С++

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "stdafx.h"
#define M_PI       3.14159265358979323846
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;                         
 
#include <gsl/gsl_integration.h>
#include <gsl/gsl_sf_ellint.h>
 
float a = 2, b = 1.2, c = 0.7; // ellipsoid radiuses
 
// the function
 
double sq(double x, void* data) 
{
    double d = 1 - c*c / (a*a);
    double eps = 1 - c*c / (b*b);
    float x2 = x*x;
    float dx = 1 - d*x2;
    float m = eps*(1 - x2) / dx;
    return sqrtf(dx)*gsl_sf_ellint_Ecomp(m, GSL_PREC_DOUBLE);
}
 
float Romberg(float a, float b) // calculates integral using Romberg method
 
{
    float R[6][6];
    int i, j, k;
    int n = 5;
 
    float h, sum;
 
    h = b - a;
 
    R[0][0] = (h / 2)*(sq(a, NULL) + sq(b, NULL));
 
    for (i = 1; i <= n; i++)
 
    {
 
        h = h / 2;
 
        sum = 0;
 
        for (k = 1; k <= int(pow(2.0, i) - 1); k += 2)
 
            sum += sq(a + k*h, NULL);
 
        R[i][0] = R[i - 1][0] / 2 + sum*h;
 
        for (j = 1; j <= i; j++)
 
            R[i][j] = R[i][j - 1] + (R[i][j - 1] - R[i - 1][j - 1]) / (pow(4.0, j) - 1);
 
    }
    return (R[n][n]);
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    float ac = a*a - c*c;
    float mu = asinf(sqrtf(ac) / a);
    float k = a / b*sqrtf(b*b - c*c) / sqrtf(ac);
    float square = M_PI*(c*c + b / (sqrtf(ac))*
        (c*c*gsl_sf_ellint_F(mu, k, GSL_PREC_DOUBLE) + ac*gsl_sf_ellint_E(mu, k, GSL_PREC_DOUBLE)));
 
    float squareRomberg = 4 * a*b*Romberg(0, 1);
 
    gsl_integration_workspace * w
        = gsl_integration_workspace_alloc(1000);
 
    double result, error;
 
    gsl_function F;
    F.function = &sq;
    F.params = NULL;
 
    gsl_integration_qags(&F, 0, 1, 0, 1e-7, 1000,
        w, &result, &error);
    float squareGauss = result * 4 * a*b;
 
    cout << "Right square = " << square << endl;
    cout << "Square using Romberg = " << squareRomberg << endl;
    cout << "Square using Gauss (GSL) = " << squareGauss << endl;
 
    system("PAUSE");
 
    return 0;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2015, 15:04
Ответы с готовыми решениями:

Вычислить площадь поверхности эллипсоида
Вычислить площадь поверхности эллипсоида, полученного вращением вокруг оси OX эллипса...

Определить площадь поверхности и объем вытянутого эллипсоида
Определить площадь поверхности и объем вытянутого эллипсоида: (1), (2) и сплюснутого эллипсоида:...

Площадь поверхности шарового сегмента
Какова площадь поверхности шарового сегмента (маленького), который отсекается 66 градусами 33...

Найти объем, площадь основания, площадь боковой поверхности и площадь полной поверхности призмы
Здравствуйте , помогите пожалуйста, очень надо , буду очень благодарна! ЗАДАНИЕ по теме...

2
Модератор
Эксперт по математике/физике
5240 / 4027 / 1385
Регистрация: 30.07.2012
Сообщений: 12,289
02.08.2015, 15:44 2
Brand17, читайте внимательно Правила форума. В частности:
4.12. Картинки и любые другие файлы загружайте на форум, во избежание их удаления или потери на сторонних ресурсах.
5.18. Запрещено размещать задания и решения в виде картинок и других файлов с их текстом.

Для набора формул пользуйтесь встроенным Редактором формул - ниже на странице...
0
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 2
03.08.2015, 00:35  [ТС] 3
Наконец нашел ошибку. В подинтегральной функции нужно брать корень из модуля.
0
03.08.2015, 00:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2015, 00:35
Помогаю со студенческими работами здесь

Рисование сегмента эллипсоида с OpenGL
Всем доброго времени суток! Никак не могу понять, как с помощью библиотеки OpenGL организовать...

Площадь сечения, площадь боковой поверхности, площадь полной поверхности пирамиды.
Добрый день! Помогите, пожалуйста, решить задачки :) Благодарю заранее!

Найти площадь сегмента круга
Не сочтите за тяжкий труд переписать текст программы в сообщение! Найти площадь сегмента круга....

Найти площадь сегмента круга
Найти площадь сегмента круга. Формула. ((R^2)/2)*(a-sin(a)). R-радиус, a-угол. кода нету. Не знаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru