Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2013, 21:48   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
Счастье Метод Рунге-Кутта 4-го порядка + метод трапеций

Добрый день!
Ребят нужен совет. Посмотрите пожалуйста код. В нем реализован метод Рунге-Кутта 4-го порядка и метод трапеции.
Кому приходилось реализовывать, оцените правильность и оптимальность!!! Жду отзывов!
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>

/* ------- Прототипы функций ------- */
double myFunc(double, double);
double trapMethod(double*, double, int);
void filing(double*, double*, int);

int main()
{
	int		a = 0;		// Начальное значение
	int		b = 1;		// Конечное значение
	int		i;			// Счетчик
	int		n;			// Количество шагов
	double  h = 0.05;	// Шаг
	double	*x = NULL; 
	double	*y = NULL;
	double	k1, k2, k3, k4;
	
	setlocale(LC_ALL, "rus");

	n = (int)((b - a) / h); // Количество шагов 
 
	x = (double*)malloc((n+1) * sizeof(double)); // Выделение памяти под массив X
	y = (double*)malloc((n+1) * sizeof(double)); // Выделение памяти под массив Y
	
	if(x == NULL || y == NULL)
	{
		printf("Ошибка памяти!!!");
		exit(1);
	}
 
	x[0] = a;
	y[0] = 0;
 
	for(i = 0; i <= n-1; i++)
	{
		k1 = myFunc(x[i], y[i]);
		k2 = myFunc(x[i] + h * 0.5, y[i] + (h * 0.5 * k1));
		k3 = myFunc(x[i] + h * 0.5, y[i] + (h * 0.5 * k2));
		k4 = myFunc(x[i] + h, y[i] + h * k3);
		x[i + 1] = x[i] + h;
		y[i + 1] = y[i] + (h / 6) * (k1 + (2 * k2) + (2 * k3) + k4);
	}
	printf("\n Результат:\n ***********************\n");
	/* Печать результата */
	for(i = 0; i <= n; i++)
		printf(" x = %.2lf -- y = %.2lf -- y^2 = %.3lf\n", x[i], y[i], pow(y[i],2));
		
	printf("\n ***********************\n");
	printf(" Количество тепла Q: %.3lf\n\n", trapMethod(y, h, n));
	
	filing(x, y, n);
	
	free(x); // Освобождение памяти
	free(y);
	 
	return 0;
}

/* ------- Дифференциальное уравнение ------- */
double myFunc(double x, double y)
{
	return cos(7 * x + y) + 7 * (x - y);
}

/* ------------- Запись в файл -------------- */
void filing(double *x, double *y, int n)
{
	FILE	*ft;
	int		i;
	
	ft = fopen("test.txt", "wt");
	if(ft == NULL) 
	{
		printf("Ошибка файла!!!.\n");
		exit(1);
	}
	
	for(i = 0; i <= n; i++)
		fprintf(ft, "x = %.3lf - y = %.3lf\n", x[i], y[i]);

	fclose(ft);
}

/* Определение количества тепла по формуле трапеций --- */
double trapMethod(double *y, double h, int n)
{
	int		i;
	double	Q = 0.0;
	
	Q = (pow(y[0],2) + pow(y[n],2)) / 2;

	for(i = 1; i < n; i++)
	{
		Q += pow(y[i],2);
	}
	Q *= h;
	
	return Q;
}

чч.jpg
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 10.11.2013 в 21:06.
Bugrimov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Рунге-Кутта Mystery08 Помощь студентам 0 15.12.2012 19:51
Метод Рунге-Кутта 4 порядка роткиВ Помощь студентам 2 25.09.2012 10:50
Метод Рунге- Кутта 5-6 порядка unique_you Помощь студентам 0 17.12.2011 15:26
Не работает метод Рунге - Кутта 2-го порядка CsandeRR Общие вопросы C/C++ 1 13.04.2010 16:27
метод Рунге-Кутта для систем дыф.уравнений 1 порядка Natok Помощь студентам 4 31.05.2009 02:37