Форум программистов, компьютерный форум CyberForum.ru

Функция Грина - C++

Восстановить пароль Регистрация
 
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
19.05.2013, 22:14     Функция Грина #1
Всем привет! Возникла необходимость в функции вернуть значение функции Грина. Сама функция выглядит так
http://www.cyberforum.ru/cgi-bin/latex.cgi?G(x,y) = \frac{1}{4\pi \left|x - y \right|} - \frac{1}{4\pi \left|x - y* \right|}
x = (x1, x2, x3), y = (y1, y2, y3), y* = (y1, y2, -y3).
Как эту формулу перевести в программный вид? Все мозги сломал уже.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2013, 22:14     Функция Грина
Посмотрите здесь:

Функция a,b,c C++
C++ Функция y=f(x)
C++ функция
функция C++
C++ Функция
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.05.2013, 22:24     Функция Грина #2
}{@k, а в чем проблема? Модуль вектора посчитать?
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
19.05.2013, 22:42  [ТС]     Функция Грина #3
Tulosba, проблема не в том, чтобы модуль вектора посчитать, а в том чтобы вернуть значение этой функции.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.05.2013, 22:45     Функция Грина #4
}{@k, хм-м. Ну приведите код, который у Вас есть. Потому что умножить, вычесть, поделить, а потом сделать return проблем вызвать не должно. Особенно, если Вы знаете как посчитать модуль вектора (как мне казалось самая сложная здесь процедура).
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
19.05.2013, 22:57     Функция Грина #5
Цитата Сообщение от }{@k Посмотреть сообщение
проблема не в том, чтобы модуль вектора посчитать, а в том чтобы вернуть значение этой функции.
? На вскидку по формуле
C++
1
2
3
4
double grinn(vector_t const& x, vector_t const& y) {
   return ( 1. / ( 4. * pi * abs( x - y ) ) )
        - ( 1. / ( 4. * pi * abs( vector_t( x.x() - y.x(), x.y() - y.y(), x.z() + y.z() ) ) ) );
}
Проблема решена?
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
19.05.2013, 23:02  [ТС]     Функция Грина #6
Tulosba, видно я тогда совсем не то делаю...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
double Grin(double* x, double* y){
    double* yy;
           double* xy, *xyy;
    yy[2] = -y[2];
           
double t, z;
    for(int i = 0; i < 3; i++){
        t += pow(xy[i], 2);
        z += pow(xyy[i], 2);
    }
double mod1 = sqrt(t);
double mod2 = sqrt(z);
 
    return pow(4 * M_PI * mod1, -1) - pow(4 * M_PI * mod2, -1);
    
}
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.05.2013, 23:09     Функция Грина #7
}{@k, в строках 3-4 не инициализированные указатели. Дальше может быть всё что угодно, когда начнете по ним читать.
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
19.05.2013, 23:09  [ТС]     Функция Грина #8
gray_fox, я подключил
C++
1
#include <vector>
но компилятор ругается на vector_t "Это объявление не содержит класс хранения или спецификатор типа"
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
19.05.2013, 23:12     Функция Грина #9
}{@k, ну я подумал вы вектора в своих структурах\классах храните, так обычно делают, что-нибудь вроде
C++
1
2
3
4
struct vector_t {
 
   double x, y, z;
};
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
19.05.2013, 23:30  [ТС]     Функция Грина #10
Tulosba, да, вы правы ошибочку выдавал. Явно указал размеры массивов, получил значение. Но в принципе я правильно формулу запрограммировал?


gray_fox, нет, я векторы не использовал, по старинке массивами пользуюсь.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.05.2013, 23:36     Функция Грина #11
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
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
 
const int size = 3;
 
double vmod( double* v )
{
    double res = 0;
    for( int i = 0; i<size; ++i )
    {
        res += v[i]*v[i];
    }
    return sqrt( res );
}
 
void vsub( double* r, double* a, double* b )
{
    for( int i=0; i<size; ++i)
    {
        r[i] = a[i] - b[i];
    }
}
 
double grin( double* x, double* y, double* ys )
{
    double temp[size];
 
    vsub( temp, x, y );
    double a1 = 1/vmod( temp );
 
    vsub( temp, x, ys );
    double a2 = 1/vmod( temp );
 
    return (a1-a2)/(4*M_PI);
}
 
int main()
{
    double x[size] = { 1,2,3 };
    double y[size] = { 4,5,6 };
    double ys[size] = { y[0], y[1], -y[2] };
 
    std::cout << grin( x, y, ys ) << std::endl;
 
    std::system( "pause" );
 
    return 0;
}
Вроде бы не налагал.

Добавлено через 1 минуту
Цитата Сообщение от }{@k Посмотреть сообщение
Но в принципе я правильно формулу запрограммировал?
Похоже на правду. Но Вы еще забыли t,z нулями инициализировать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 23:39     Функция Грина
Еще ссылки по теме:

Функция C++
Функция try C++
C++ Функция

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

Или воспользуйтесь поиском по форуму:
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
19.05.2013, 23:39  [ТС]     Функция Грина #12
Tulosba, спасибо за помощь.
Я их после того как ответ отправил инициализировал
Yandex
Объявления
19.05.2013, 23:39     Функция Грина
Ответ Создать тему
Опции темы

Текущее время: 11:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru