Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 26.10.2009
Сообщений: 8
1

Точность расчетов

06.06.2010, 11:23. Показов 714. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проблема в точности расчетов, действия над числаси производятся в выделенном коде (с 97 по 121 строки), по сути это метод Жордана-Гаусса (аналог Гаусса, только матрица диагональная, а не треугольная). В результате получается большая погрешность вычисления ( 5 значащих разрядов из 7 в float). Как можно исправить ситуацию? =/
Код
struct factor
{
	double* arg;   // коэффициент при комплексном аргументе s ;
	int max_degree;  // старшая степень комплексного аргумента s;
	double denominator; // модуль корня знаменателя простейшей дроби;
	int denominator_degree; // степень знаменателя простейшей дроби;
};
void Throughput(int, unsigned long**);
float time_delay(VPath* route, int L, float* CLoad);
float integral(int degree_arg, float arg, float intensity);
float factorial(int n);
template <class Type> Type** zeroing(int num, Type**);
int ElementNum (int i, int j, int size);

int Hna = 48;       // длина заголовка уровня сетевого доступа (канальный уровень);
int Hip = 320;      // длина IP заголовка;
unsigned long** V;
int num_knots = 4;
float Td = 0.5;     

int _tmain(int argc, _TCHAR* argv[])
{
	V = zeroing(num_knots,V);
	Throughput(num_knots, V);
	float* CLoad = new float[num_knots*num_knots-num_knots]; // матрица загрузок каналов;
	VPath* route = new VPath;
	route->knot = new int[3];
	route->knot[0] = 4;
	route->knot[1] = 1;
	route->knot[2] = 2;
	route->knot[3] = 3;
	route->lenght = 3;
	CLoad[ElementNum(3,0,num_knots)] = 0.80013329;
	CLoad[ElementNum(0,1,num_knots)] = 0.80013335;
	CLoad[ElementNum(1,2,num_knots)] = 0.80013339;
	cout << time_delay(route,8000,CLoad);
	float a11 = 6.3957348 ;
	float a21 = 6.3957329 ;

	cin.get();
	return 0;
}
float time_delay(VPath* route, int L, float* CLoad) // CLoad (Channel Loading) загрузка канала, L - длина пакета, Ts - время задержки, V - матрица пропускных способностей ЛЦТ-ов, Route - набор виртуальных путей;
{
	int Vb = 64000;                               // скорость вокодера;
	float Tq = Td - (float)(L - Hip) / (float)Vb; // заданное время пребывания пакета в пути (исключая время пакетизации);
	double intensity;                              // intensity - интенсивность потока;
	float result = 0;
	double PTime;
	double summA;
	factor* A;
	do{
		summA = 0;
		PTime = 0;
		A = new factor[route->lenght + 1];   // вектор коэффициентов;
		for(int num_A = 0; num_A< route->lenght + 1; num_A++){
			A[num_A].arg = new double[route->lenght];
			A[num_A].max_degree = 0;
			A[num_A].denominator = 0;
			A[num_A].denominator_degree = 1;
			for(int j = 0; j < route->lenght; j++){
				if(j != 0) A[num_A].arg[j] = 0;
				else A[num_A].arg[j] = 1;
			}
		}

		for(int i=0; i < route->lenght; i++){            // i - номер вершины в пути
			intensity =( V[route->knot[i]-1][route->knot[i+1]-1] / (L + Hna) * (1 - CLoad[ElementNum (route->knot[i]-1, route->knot[i+1]-1, num_knots)]));
			for(int num_A = 0; num_A < route->lenght; num_A++){         // num_A - номер коэффициента
				if(num_A != i){					// проверка умножения №1
					if(A[num_A].denominator != intensity){  // проверка умножения №2
						for(int k = A[num_A].max_degree + 1; k>=0; k--){          // k - степень аргумента S
							if(k == 0)
								A[num_A].arg[k] = A[num_A].arg[k] * intensity;
							else{
								if(k == A[num_A].max_degree)
									A[num_A].arg[k] = A[num_A].arg[k-1] + intensity;
								else{
									if(k == A[num_A].max_degree + 1)
										A[num_A].arg[k] = 1;
									else
										A[num_A].arg[k] = A[num_A].arg[k] * intensity + A[num_A].arg[k-1];
								}
							}
						}
						A[num_A].max_degree++;
					}
					else
						A[num_A].denominator_degree++;
				}
				else
					A[num_A].denominator = intensity;
			}
			A[route->lenght].arg[0] = A[route->lenght].arg[0] * intensity;
		}
		[B]for(int num_A = 0; num_A < route->lenght; num_A++){
			for(int s = 0; s < route->lenght; s++)
				if(s != num_A){
					if (A[num_A].arg[num_A] == 0){
						for (int i = 0; i < route->lenght + 1; i++)
							A[i].arg[num_A] = A[i].arg[num_A] + A[i].arg[num_A+1];
					}
					intensity = A[num_A].arg[s];
					for(int i = 0; i < route->lenght + 1; i++){
						if(i == num_A)
							A[i].arg[s] = 0;
						else
							A[i].arg[s] = A[i].arg[s] - intensity * (A[i].arg[num_A] / A[num_A].arg[num_A]);
					}
				}
		}
[/B]
		
		[B]for(int num_A = 0; num_A < route->lenght; num_A++){
			if(num_A == route->lenght-1)
				A[num_A].arg[num_A] = -summA;
			else{
				A[num_A].arg[num_A] = A[route->lenght].arg[num_A]/A[num_A].arg[num_A];
				summA = summA + A[num_A].arg[num_A];
			}[/B]
			
			if(A[num_A].arg[num_A] != 0){
				intensity = ( V[route->knot[num_A]-1][route->knot[num_A+1]-1] / (float)(L + Hna) * (1 - CLoad[ElementNum (route->knot[num_A]-1, route->knot[num_A+1]-1, num_knots)]));
				PTime = PTime + (A[num_A].arg[num_A] / factorial(A[num_A].denominator_degree - 1)) * integral(A[num_A].denominator_degree - 1,Tq,intensity);
			}
		}
		result = result + (1-PTime);
		//cout << endl;
		//cout << result << endl;  // проверка
		//cout << endl;
		for(int num_A = 0; num_A< route->lenght + 1; num_A++)
			delete [] A[num_A].arg;
		delete[] A;
		A = (factor*)NULL;
		route = route->next_vpath;
	}while(route != (VPath*)NULL);
	return result;
}
float integral(int degree_arg, float arg, float intensity)   // рекурсивная функция поиска интеграла
{
	float result;
	if(degree_arg != 0)
		result = -(pow(arg,degree_arg) * exp(-intensity * arg))/intensity + (degree_arg/intensity)*integral(degree_arg - 1,arg,intensity);
	else
		result = (1-exp(-intensity * arg))/intensity;
	return result;
}
float factorial(int n)
{
	float result = 1;
	if(n != 0)
		for(int i = n; i>0; i--)
			result = result * i;
	return result;
}
void Throughput(int num_knots, unsigned long** result)
{
	for(int i = 0; i < num_knots; i++)
		for(int j = i; j < num_knots; j++){
			if (i != j){
				// cout << "VVedite V["<<i+1<<"]["<<j+1<<"]: ";
				// cin >> result[i][j];
				result[i][j] = 256 * 1024*(i+1);           // заполнение матрицы;
				result[j][i] = 256 * 1024*(i+1);
			}
		}
}
template <class Type> Type** zeroing(int num, Type** result)
{
	result = new Type*[num];
	for(int i = 0; i < num; i++){
		result[i] = new Type[num];
		for(int j = 0; j < num; j++)
			result[i][j] = 0;
	}
	return result;
}
int ElementNum (int i, int j, int size)
{
	if (j > i)
		return i*(size-1) + j - 1;
	else
		return i*(size-1) + j;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2010, 11:23
Ответы с готовыми решениями:

Точность значения пи.
Пожалуйста можете помочь с задачей. Напишите программу, которая вычисляет число ПИ с заданной ...

Точность вычислений
Почему в программе при написании float A = 28.8; float B = 19.6;в отлатчике видим A =...

Правильность расчетов
Всем добро! И всем добра! :) Подскажите если в этом коде есть ошибка которая в будущем может...

Визуализация расчетов
Имеется рабочая программа на Си. В результате её работы получается текстовый файл, содержащий три...

0
06.06.2010, 11:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2010, 11:23
Помогаю со студенческими работами здесь

программа для расчетов
я начал делать но не понял помогите #include&lt;iostream&gt; #include&lt;Windows.h&gt; #include&lt;math.h&gt;...

Концепция визуализации расчётов
В двух словах: есть базовый курс c++ borland c++ builder 6 В кои веки взялся сделать что-то...

Неверное значение по результатам расчетов
Доброго дня. У меня возникла проблема следующего характера: программа считает среднее набора...

Программа для математических расчетов
Народ, хочу попросить Вас о следующем. Мне надо написать программу по следующему типу: 1)...

Библиотека для статистических расчетов
посоветуйте мат. библиотеку C++, где реализованы все эти формулы...

Точность и т.д.
1)Дано два целых числа a і b. Виведите гипотенузу с катетами a и b с точностью 6 знаков. Вх одные...


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

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