Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мат.мет.АРЭС МАРЭС / Методические указания к выполнению курсовой работы / Методические указания к выполнению курсовой работы.pdf
Скачиваний:
39
Добавлен:
28.05.2015
Размер:
758.92 Кб
Скачать

45.

Листинг программы

#include <stdio.h>

 

 

 

#include <math.h>

 

 

 

#define MAX_N 2

/*

Здесь задать максимальный размер систем ДУ */

#define E0 1e-4

/*

Допустимая погрешность одного шага

*/

typedef void (*function)();

void Cutt_Merson(double, function, int); /* Объявляем процедуры */ void sost1(double*, double);

/* Глобальные переменные */

double X[MAX_N], X1[MAX_N], Y[MAX_N],

k1[MAX_N], k2[MAX_N], k3[MAX_N], k4[MAX_N], k5[MAX_N], Err[MAX_N], dX[MAX_N];

double h;

 

main(){

 

int i,k;

 

double t,error;

 

int N=2;

/* Число уравнений для текущего состояния */

h=0.4; X[0]=0; X[1]=0; t=0; Err[0]=0; Err[1]=0; /* Начальные условия */ k=0;

printf("\n\n"); do {

printf("t=%f, Uc=%f, IL=%f E=%f : %f\n",t,X[0],X[1],Err[0],Err[1]); Cutt_Merson(t, sost1, N); /*Расчет приращений методом Кутта-Мерсона*/ error = fabs(Err[0]); /* Выбор максимальной ошибки из вектора Err*/ if(fabs(Err[1]) > error) error = fabs(Err[1]);

if(error > E0) h = h/2.0;

/* Уменьшение шага интегрирования */

else {

 

t = t + h;

/* Расчет текущего времени */

for(i = 0; i < N; i++)

 

X[i]=X[i]+dX[i];

/* Расчет переменных состояния */

if(error < E0/32.0) h = h*2.0; /* Увеличение шага интегрирования */

}

 

} while(++k < 24);

/* Повторить 24 раза */

getch();

/* Ожидание нажатия любой клавиши */

}

© А. Кудинов, 2006, ТГУ, каф.ПЭ

46.

void Cutt_Merson(double t, function F, int N){

int i; double t1;

t1 = t;

 

for(i = 0; i < N; i++)

X1[i] = X[i];

F(X1,t1);

 

for(i = 0; i < N; i++)

k1[i] = (h*Y[i])/3.0;

t1 = t + h/3;

 

for(i = 0; i < N; i++)

X1[i] = X[i] + k1[i];

F(X1,t1);

 

for(i = 0; i < N; i++)

k2[i] = (h*Y[i])/3.0;

t1 = t + h/3;

 

for(i = 0; i < N; i++)

X1[i] = X[i] + 0.5*k1[i] + 0.5*k2[i];

F(X1,t1);

 

for(i = 0; i < N; i++)

k3[i] = (h*Y[i])/3.0;

t1 = t + h/2;

 

for(i = 0; i < N; i++)

X1[i] = X[i] + 3*k1[i]/8 + 9*k3[i]/8;

F(X1,t1);

 

for(i = 0; i < N; i++)

k4[i] = (h*Y[i])/3.0;

t1 = t + h;

 

for(i = 0; i < N; i++)

X1[i] = X[i] + 1.5*k1[i] - 4.5*k3[i] + 6*k4[i];

F(X1,t1);

 

for(i = 0; i < N; i++)

k5[i]=(h*Y[i])/3.0;

for(i = 0; i < N; i++){

Err[i] = 0.2*(k1[i] - 4.5*k3[i] + 4*k4[i] - 0.5*k5[i]); dX[i] = 0.5*(k1[i] + 4*k4[i] + k5[i]);

}

}

void sost1(double *x, double t){ /* Здесь описана СДУ состояния (38) */ Y[0] = x[1];

Y[1] = -1.0*x[0] - 0.5*x[1] + 10.0;

}

© А. Кудинов, 2006, ТГУ, каф.ПЭ

47.

Программа выводит на экран 24 строки (именно столько умещается на стандартный экран), каждая из которых соответствует определенному моменту времени t. В первом столбце выводится время, во втором и третьем — переменные состояния UC и IL, в четвертом и пятом — предельные погрешности этих переменных:

Результат работы программы

t=0.000000, Uc= 0.000000, IL= 0.000000 E= 0.000000 : 0.000000 t=0.000000, Uc= 0.000000, IL= 0.000000 E=-0.000124 : -0.000044 t=0.200000, Uc= 0.192853, IL= 1.890590 E=-0.000004 : -0.000001 t=0.400000, Uc= 0.739419, IL= 3.529543 E=-0.000004 : -0.000000 t=0.600000, Uc= 1.585304, IL= 4.878625 E=-0.000004 : 0.000000 t=0.800000, Uc= 2.669932, IL= 5.914240 E=-0.000004 : 0.000001 t=1.000000, Uc= 3.929435, IL= 6.626927 E=-0.000004 : 0.000002 t=1.200000, Uc= 5.299388, IL= 7.020380 E=-0.000003 : 0.000002 t=1.400000, Uc= 6.717307, IL= 7.110050 E=-0.000003 : 0.000003 t=1.800000, Uc= 9.469524, IL= 6.488291 E=-0.000072 : 0.000090 t=2.200000, Uc=11.798820, IL= 5.050814 E=-0.000035 : 0.000093 t=2.600000, Uc=13.448548, IL= 3.151153 E=-0.000000 : 0.000082 t=3.000000, Uc=14.305818, IL= 1.144899 E= 0.000029 : 0.000062 t=3.400000, Uc=14.391592, IL=-0.661554 E= 0.000048 : 0.000036 t=3.800000, Uc=13.833427, IL=-2.045933 E= 0.000058 : 0.00001 t=4.200000, Uc=12.827903, IL=-2.886647 E= 0.000057 : -0.000013 t=4.600000, Uc=11.599981, IL=-3.161936 E= 0.000048 : -0.000030 t=5.000000, Uc=10.365674, IL=-2.934888 E= 0.000034 : -0.000039 t=5.400000, Uc= 9.302755, IL=-2.329039 E= 0.000018 : -0.000041 t=5.800000, Uc= 8.532254, IL=-1.499735 E= 0.000002 : -0.000037 t=6.200000, Uc= 8.111423, IL=-0.606143 E=-0.000012 : -0.000029 t=6.600000, Uc= 8.037102, IL= 0.212223 E=-0.000021 : -0.000017 t=7.000000, Uc= 8.257122, IL= 0.851897 E=-0.000025 : -0.000006 t=7.400000, Uc= 8.686653, IL= 1.253735 E=-0.000025 : 0.000005

Можно видеть, что во второй строке данной таблицы время и переменные состояния не получили приращений. Это произошло потому, что расчетная погрешность при пробном шаге h = 0,4 сек. оказалась выше заданной, и интегрирование выполнялось повторно при новом, половинном шаге 0,2 сек.

© А. Кудинов, 2006, ТГУ, каф.ПЭ