- •ВВЕДЕНИЕ
- •1. МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ
- •1.1. Описание объекта исследования
- •1.2. Математическая модель электромагнитного демпфера
- •1.3. Моделирование динамических процессов
- •2. ПРОГРАММИРОВАНИЕ
- •2.1. Составление блок-схемы алгоритма программы
- •2.2. Коррекция точек стыковки.
- •2.3. Численное интегрирование
- •Листинг программы
- •Результат работы программы
- •2.4 Определение времени переходного процесса
- •2.5 Гармонический анализ сигналов
- •3. ОФОРМЛЕНИЕ РЕЗУЛЬТАТОВ РАБОТЫ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
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, ТГУ, каф.ПЭ