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

Перегрузка функции. Возврат вычислений - C++

Восстановить пароль Регистрация
 
Slayerz
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 25
Завершенные тесты: 1
16.08.2012, 18:01     Перегрузка функции. Возврат вычислений #1
Всем добрый день. Реализую метод Рунге-Кутта 4го порядка через перегрузку функции. Долго ломал голову о неправильности вычисления метода, потом наконец уловил ошибку. Она заключается в следующем: при вычислении каждого элемента К(i+1) = h*func(x + k(i+1)/2) программа возвращает в перегруженную функцию новые значения X, а этого не должно происходить. То есть, вычисления на протяжения всего шага для К1, К2, К3, К4 должны происходить с одними и теми же значениями, а вот в конце вычислений X присваивается новое значение, и идет вычисление с новыми значениями полученными для нового шага: x = x + drez.

Сама программа работает по следующему принципу: пользователь вводит начальные данные, которые заносятся в вектор и отправляются в перегруженную функцию. После вычислений в перегрузке, результаты отправляются в Рунге-Кутта и там уже должны происходить вычисления.

Кусок программы с Рунге-Куттом. Т.к. Это векторные вычисления, естественно, перегрузка операторов реализована, но здесь его размещать не имеет смысла.

C++
1
2
3
4
5
6
7
 // Программа, реализующая метод Рунге-Кутта.
k1 = h*func(x); 
k2 = h*func(x +(k1/2.0));
k3 = h*func(x + (k2/2.0));
k4 = h*func(x + k3);
drez = (k1 + 2*k2 + 2*k3 + k4)/6;
x = x + drez;

Заголовочный файл с функциями.
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
#include<iostream>
#include<vector>
#define _USE_MATH_DEFINES 
#include<math.h>
 
using namespace std;
 
vector<double> func(vector<double> x)
{
    vector<double> x_new;
    x_new.resize(10);
    double F = x[0], a = x[1], e = x[2], u_temp = x[3], tetta_temp = x[4]; 
// Пробовал делать static double, но тогда программа фиксирует числа,
// и на шагах K2, K3, K4 не происходит вычислений, то есть просто выдает результат h*func(x), а не: h*func(x + k(i +1)/2.0) 
    double p, r, omega, lambda, mu, u, tetta;
    double Vr, Vt;
 
    mu = 398603.0;
    u = (u_temp*M_PI)/180.0;
    tetta = (tetta_temp*M_PI)/180.0;
    p = a*(1.0 - pow(e, 2.0));
    r = p/(1.0 + e*cos(tetta));
    omega = u - tetta;
    lambda = atan( (cos(omega) / sin(omega)) * ( (1.0 + e*cos(omega))) / (2.0 + e*cos(omega)) ); 
 
    Vr = sqrt(fabs(p/mu))*sin(omega);
    Vt = sqrt(fabs(p/mu))*(1.0 + e*cos(omega));
 
    x_new[0] = F * sqrt(fabs(p/mu)) * ( ( ( sin(omega)*cos(lambda) ) + ( (e*pow(cos(omega), 2.0)) + (2.0*cos(omega)) + e)/(1.0 + e*cos(omega) ) ) * sin(lambda) );
    x_new[1] = (2.0*F*p)/(1 + e*cos(omega)) * sqrt(fabs(p/mu)) * sin(omega);
    x_new[2] = (F/e) * sqrt(fabs(p/mu)) * ( ( ((-cos(omega))*sin(lambda)) + ((2.0 + e*cos(omega)*sin(omega))/(1.0 + e*cos(omega))))*sin(lambda) );
    x_new[3] = ((F*p)/(1.0 + pow(e, 2.0))) * sqrt(fabs(p/mu)) * ((-sin(omega))*cos(lambda) - ( ((2.0*(1.0 - cos(omega)) + e*pow(sin(omega),2.0))/(1.0 + e*cos(omega))) * sin(lambda)));
    x_new[4] = ((F*p)/(1.0 - pow(e, 2.0))) * sqrt(fabs(p/mu)) * ((sin(omega))*cos(lambda) - ( ((2.0*(1.0 + cos(omega)) - e*pow(sin(omega),2.0))/(1.0 + e*cos(omega))) * sin(lambda)));
    x_new[5] = ((sqrt(mu*p))/(pow(r, 2.0))) + (((F*cos(omega))/e) * sqrt(fabs(p/mu)) * cos(lambda)) - (((F*sin(omega))/e)*(1.0 + r/p)* sqrt(fabs(p/mu)) * sin(lambda));
    
    x_new[6] = Vr;
    x_new[7] = Vt/r;
    x_new[8] = (pow(Vt, 2.0)/r) - (mu/pow(r, 2.0)) + (F*cos(lambda));
    x_new[9] = (-((Vt*Vr)/r)) + (F*sin(lambda));
    
    return x_new;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2012, 18:01     Перегрузка функции. Возврат вычислений
Посмотрите здесь:

Возврат строки из функции C++
Возврат значения из функции C++
C++ Возврат массива из функции
C++ Результат вычислений функции
C++ Неверный возврат из функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21423 / 10208 / 1662
Регистрация: 12.02.2012
Сообщений: 17,082
16.08.2012, 20:17     Перегрузка функции. Возврат вычислений #2
Перегрузка функций - это когда у тебя две (или более) функции с разными списками параметров. Например:

C++
1
2
3
4
5
6
7
8
double F1(int x)
{
...
}
double F1(double x)
{
...
}
Где у тебя перегрузка?
Slayerz
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 25
Завершенные тесты: 1
16.08.2012, 20:42  [ТС]     Перегрузка функции. Возврат вычислений #3
C++
1
2
3
4
vector<double> func(vector<double> x)
{
...
}
Нижний код в 1ом посту. А если точнее - 8-ая строка в коде, инициализация перегрузки.
Catstail
Модератор
 Аватар для Catstail
21423 / 10208 / 1662
Регистрация: 12.02.2012
Сообщений: 17,082
16.08.2012, 20:54     Перегрузка функции. Возврат вычислений #4
Одна функция func... Что перегружается?
Yandex
Объявления
16.08.2012, 20:54     Перегрузка функции. Возврат вычислений
Ответ Создать тему
Опции темы

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