Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:защита инфы и мат моделирование / ЗАНЯТИЯ_ОСЕНЬЮ_2011 / МАТЕМАТИЧЕСКОЕ_МОДЕЛИРОВАНИЕ_В_САПР / ОТЧЕТ_ПО_1_Й_ЛАБ_РАБОТЕ / ПРОГРАММЫ_СИ_6 / МОДЕЛИРОВАНИЕ_0
.c
#include <stdio.h>
#include <math.h>
//#define Pi 3.14159265358979312
/////////////////////////
// //
// МОДЕЛИРОВАНИЕ_0.c //
// //
/////////////////////////
double Pi = 3.14159265358979312;
void Calc_Step_Appr(int Order_Appr, double C[2][2], double Delta_t,
double d_Alfa_dt_Inp, double d_Beta_dt_Inp,
double Alfa_Inp, double Beta_Inp,
double *d_Alfa_dt_Out, double *d_Beta_dt_Out,
double *Alfa_Out, double *Beta_Out)
{
double d_Alfa_dt, d2_Alfa_dt2, d3_Alfa_dt3, d4_Alfa_dt4, d5_Alfa_dt5,
d6_Alfa_dt6, d7_Alfa_dt7, d8_Alfa_dt8, d9_Alfa_dt9,
d_Beta_dt, d2_Beta_dt2, d3_Beta_dt3, d4_Beta_dt4, d5_Beta_dt5,
d6_Beta_dt6, d7_Beta_dt7, d8_Beta_dt8, d9_Beta_dt9;
// ФОРМИРОВАНИЕ СТЕПЕННОГО РЯДА
double t_1 = Delta_t, t_2 = t_1 * t_1, t_3 = t_2 * t_1, t_4 = t_3 * t_1, t_5 = t_4 * t_1,
t_6 = t_5 * t_1, t_7 = t_6 * t_1, t_8 = t_7 * t_1, t_9 = t_8 * t_1;
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ВТОРЫХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПО ТОЧНЫМ УРАВНЕНИМ СВЯЗИ
d_Alfa_dt = d_Alfa_dt_Inp; d_Beta_dt = d_Beta_dt_Inp;
d2_Alfa_dt2 = C[0][0] * d_Beta_dt + C[0][1];
d2_Beta_dt2 = C[1][0] * d_Alfa_dt + C[1][1];
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ТРЕТЬИХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПУТЕМ ДИФФЕРЕНЦИРОВАНИЯ
d3_Alfa_dt3 = C[0][0] * d2_Beta_dt2;
d3_Beta_dt3 = C[1][0] * d2_Alfa_dt2;
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ЧЕТВЕРТЫХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПУТЕМ ДИФФЕРЕНЦИРОВАНИЯ
d4_Alfa_dt4 = C[0][0] * d3_Beta_dt3;
d4_Beta_dt4 = C[1][0] * d3_Alfa_dt3;
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ПЯТЫХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПУТЕМ ДИФФЕРЕНЦИРОВАНИЯ
d5_Alfa_dt5 = C[0][0] * d4_Beta_dt4;
d5_Beta_dt5 = C[1][0] * d4_Alfa_dt4;
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ШЕСТЫХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПУТЕМ ДИФФЕРЕНЦИРОВАНИЯ
d6_Alfa_dt6 = C[0][0] * d5_Beta_dt5;
d6_Beta_dt6 = C[1][0] * d5_Alfa_dt5;
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ СЕДЬМЫХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПУТЕМ ДИФФЕРЕНЦИРОВАНИЯ
d7_Alfa_dt7 = C[0][0] * d6_Beta_dt6;
d7_Beta_dt7 = C[1][0] * d6_Alfa_dt6;
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ВОСЬМЫХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПУТЕМ ДИФФЕРЕНЦИРОВАНИЯ
d8_Alfa_dt8 = C[0][0] * d7_Beta_dt7;
d8_Beta_dt8 = C[1][0] * d7_Alfa_dt7;
// ФОРМИРОВАНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ДЕВЯТЫХ ПРОИЗВОДНЫХ В НАЧАЛЕ ШАГА ПУТЕМ ДИФФЕРЕНЦИРОВАНИЯ
d9_Alfa_dt9 = C[0][0] * d8_Beta_dt8;
d9_Beta_dt9 = C[1][0] * d8_Alfa_dt8;
// РАЗЛОЖЕНИЕ ВТОРЫХ ПРОИЗВОДНЫХ В РЯД ТЕЙЛОРА
// d2_Alfa_dt2(t) = d2_Alfa_dt2 + d3_Alfa_dt3 * t1/1! + d4_Alfa_dt4 * t2/2! + d5_Alfa_dt5 * t3/3!
// d2_Beta_dt2(t) = d2_Beta_dt2 + d3_Beta_dt3 * t1/1! + d4_Beta_dt4 * t2/2! + d5_Beta_dt5 * t3/3!
// ПЕРВЫЕ ПРОИЗВОДНЫЕ ЭТО ИНТЕГРАЛ ОТ ВТОРЫХ ПРОИЗВОДНЫХ НА ШАГЕ - Delta_t
// d_Alfa_dt = Int(d2_Alfa_dt2(t))dt И d_Beta_dt = Int(d2_Beta_dt2(t))dt
// ИНТЕГРИРУЯ ПРЕДЫДУЩЕЕ ВЫРАЖЕНИЕ ПОЛУЧАЕМ В ПРЕДЕЛАХ ОТ НОЛЯ ДО Delta_t ПОЛУЧАЕМ
if(Order_Appr >=2)
{
*d_Alfa_dt_Out = d_Alfa_dt_Inp + d2_Alfa_dt2 * t_1;
*d_Beta_dt_Out = d_Beta_dt_Inp + d2_Beta_dt2 * t_1;
*Alfa_Out = Alfa_Inp + d_Alfa_dt_Inp * t_1 + d2_Alfa_dt2 * t_2/2.;
*Beta_Out = Beta_Inp + d_Beta_dt_Inp * t_1 + d2_Beta_dt2 * t_2/2.;
}
if(Order_Appr >=3)
{
*d_Alfa_dt_Out = *d_Alfa_dt_Out + d3_Alfa_dt3 * t_2/2.;
*d_Beta_dt_Out = *d_Beta_dt_Out + d3_Beta_dt3 * t_2/2.;
*Alfa_Out = *Alfa_Out + d3_Alfa_dt3 * t_3/6.;
*Beta_Out = *Beta_Out + d3_Beta_dt3 * t_3/6.;
}
if(Order_Appr >=4)
{
*d_Alfa_dt_Out = *d_Alfa_dt_Out + d4_Alfa_dt4 * t_3/6.;
*d_Beta_dt_Out = *d_Beta_dt_Out + d4_Beta_dt4 * t_3/6.;
*Alfa_Out = *Alfa_Out + d4_Alfa_dt4 * t_4/24.;
*Beta_Out = *Beta_Out + d4_Beta_dt4 * t_4/24.;
}
if(Order_Appr >=5)
{
*d_Alfa_dt_Out = *d_Alfa_dt_Out + d5_Alfa_dt5 * t_4/24.;
*d_Beta_dt_Out = *d_Beta_dt_Out + d5_Beta_dt5 * t_4/24.;
*Alfa_Out = *Alfa_Out + d5_Alfa_dt5 * t_5/120.;
*Beta_Out = *Beta_Out + d5_Beta_dt5 * t_5/120.;
}
if(Order_Appr >=6)
{
*d_Alfa_dt_Out = *d_Alfa_dt_Out + d6_Alfa_dt6 * t_5/120.;
*d_Beta_dt_Out = *d_Beta_dt_Out + d6_Beta_dt6 * t_5/120.;
*Alfa_Out = *Alfa_Out + d6_Alfa_dt6 * t_6/720.;
*Beta_Out = *Beta_Out + d6_Beta_dt6 * t_6/720.;
}
if(Order_Appr >=7)
{
*d_Alfa_dt_Out = *d_Alfa_dt_Out + d7_Alfa_dt7 * t_6/720.;
*d_Beta_dt_Out = *d_Beta_dt_Out + d7_Beta_dt7 * t_6/720.;
*Alfa_Out = *Alfa_Out + d7_Alfa_dt7 * t_7/5040.;
*Beta_Out = *Beta_Out + d7_Beta_dt7 * t_7/5040.;
}
if(Order_Appr >=8)
{
*d_Alfa_dt_Out = *d_Alfa_dt_Out + d8_Alfa_dt8 * t_7/5040.;
*d_Beta_dt_Out = *d_Beta_dt_Out + d8_Beta_dt8 * t_7/5040.;
*Alfa_Out = *Alfa_Out + d8_Alfa_dt8 * t_8/40320.;
*Beta_Out = *Beta_Out + d8_Beta_dt8 * t_8/40320.;
}
if(Order_Appr ==9)
{
*d_Alfa_dt_Out = *d_Alfa_dt_Out + d9_Alfa_dt9 * t_8/40320.;
*d_Beta_dt_Out = *d_Beta_dt_Out + d9_Beta_dt9 * t_8/40320.;
*Alfa_Out = *Alfa_Out + d9_Alfa_dt9 * t_9/362880.;
*Beta_Out = *Beta_Out + d9_Beta_dt9 * t_9/362880.;
}
// И НАКОНЕЦ ВЫХОДНЫЕ ВЕЛИЧИНЫ ЭТО ИНТЕГРАЛ ОТ ПЕРВЫХ ПРОИЗВОДНЫХ НА ШАГЕ - Delta_t
// Alfa = Int(d_Alfa_dt(t))dt И Beta = Int(d_Beta_dt(t))dt
}
void Calc_Step_Corr(double A0, double B0, double H, double Beta0, double d_Alfa_dt_Inp_0,
double d_Beta_dt_Inp_0, int Step_Int, double Delta_t,
double *Alfa_Out_Corr, double *Beta_Out_Corr)
{
double Lmbd = (H * cos(Beta0))/sqrt(A0 * B0);
double T_Inp = (double)(Step_Int) * Delta_t;
*Alfa_Out_Corr = (d_Beta_dt_Inp_0/Lmbd) * sqrt(B0/A0) * (cos(Lmbd * T_Inp) -1.);
*Alfa_Out_Corr = *Alfa_Out_Corr + (d_Alfa_dt_Inp_0/Lmbd) * sin(Lmbd * T_Inp);
*Beta_Out_Corr = (d_Alfa_dt_Inp_0/Lmbd) * sqrt(A0/B0) * (1. - cos(Lmbd * T_Inp));
*Beta_Out_Corr = *Beta_Out_Corr + (d_Beta_dt_Inp_0/Lmbd) * sin(Lmbd * T_Inp);
}
void main()
{
int i, Step_Int, Order_Appr, Lim_Step_Int;
// ВХОДНЫЕ ВЕЛИЧИНЫ, КОТОРЫЕ ЗАДАЮТСЯ.
double A_Plus_A1, A_Plus_B1, C1, A2, Beta0, H, L_Ksi, L_Gamma, Divisor;
// ВЫЧИСЛЯЕМЫЕ ВЕЛИЧИНЫ
double Cos_Beta0_Pow_2, Sin_Beta0_Pow_2, A0, B0;
// ВЫХОДНЫЕ ВЕЛИЧИНЫ
double C00, C01, C10, C11;
double C[2][2], Delta_t, d_Alfa_dt_Inp, d_Beta_dt_Inp, Alfa_Inp, Alfa_Inp_Aprr, Beta_Inp,
d_Alfa_dt_Out, d_Beta_dt_Out, Alfa_Out, Beta_Out;
double d_Alfa_dt_Inp_0, d_Beta_dt_Inp_0, Alfa_Out_Corr, Beta_Out_Corr, Mist_Abs_Alfa,
Beta_Inp_Aprr, Mist_Abs_Beta;
double Accum_Square_Alfa, Accum_Square_Beta, Ampl_Alfa_Effectiv, Ampl_Beta_Effectiv;
double Accum_Square_Mist_Alfa, Accum_Square_Mist_Beta, Mist_Square_Alfa_Abs, Mist_Square_Beta_Abs,
Mist_Square_Alfa_Rel, Mist_Square_Beta_Rel;
double Alfa_Inp_Serv, Beta_Inp_Serv, d_Alfa_dt_Inp_Serv, d_Beta_dt_Inp_Serv;
// ЗАДАНИЕ ВХОДНЫХ ВЕЛИЧИН (НАПРИМЕР, ВТОРОЙ ВАРИАНТ)
A_Plus_A1 = 6.2; A_Plus_B1 = 6.2; C1 = 2.; A2 = 3.; H = 1200.;
Beta0 = 15.*(Pi/180.);
L_Ksi = 0.000; L_Gamma = 0.000;
// ВЫЧИСЛЕНИЕ ПРОМЕЖУТОЧНЫХ ВЕЛИЧИН
Cos_Beta0_Pow_2 = pow(cos(Beta0),2.); Sin_Beta0_Pow_2 = pow(sin(Beta0),2.);
A0 = A_Plus_A1 * Cos_Beta0_Pow_2 + C1 * Sin_Beta0_Pow_2 + A2;
B0 = A_Plus_B1;
C00 = (- H * cos(Beta0))/A0;
C01 = L_Ksi/A0;
C10 = (H * cos(Beta0))/B0;
C11 = L_Gamma/B0;
// ВЫВОД НА ПЕЧАТЬ ПРОМЕЖУТОЧНЫХ ВЕЛИЧИН
C[0][0] = C00; C[0][1] = C01;
C[1][0] = C10; C[1][1] = C11;
Delta_t = 1./(8.*256.);
// ЗАДАНИЕ НАЧАЛЬНЫХ УСЛОВИЙ
Alfa_Inp_Serv = 0.; Beta_Inp_Serv = 0.; d_Alfa_dt_Inp_Serv = 73.; d_Beta_dt_Inp_Serv = -32.;
printf ("\n");
printf ("\n TEST MODELIR");
printf ("\n");
//Order_Appr = 9;
//printf ("\n Order_Appr = %1u", Order_Appr);
printf ("\n");
printf ("\n");
printf ("\n");
Lim_Step_Int = 16;
for(Order_Appr = 2; Order_Appr < 10; Order_Appr++)
{
Accum_Square_Alfa = 0.; Accum_Square_Beta = 0.; Accum_Square_Mist_Alfa = 0.; Accum_Square_Mist_Beta = 0.;
Alfa_Inp = Alfa_Inp_Serv; Beta_Inp = Beta_Inp_Serv;
d_Alfa_dt_Inp = d_Alfa_dt_Inp_Serv; d_Beta_dt_Inp = d_Beta_dt_Inp_Serv;
d_Alfa_dt_Inp_0 = d_Alfa_dt_Inp;
d_Beta_dt_Inp_0 = d_Beta_dt_Inp;
for(Step_Int = 0; Step_Int < Lim_Step_Int; Step_Int++)
{
Calc_Step_Corr(A0, B0, H, Beta0, d_Alfa_dt_Inp_0, d_Beta_dt_Inp_0, Step_Int, Delta_t,
&Alfa_Out_Corr, &Beta_Out_Corr);
Alfa_Inp_Aprr = Alfa_Inp; Beta_Inp_Aprr = Beta_Inp;
// printf ("\n Alfa_Inp_Aprr = %13.12f:", Alfa_Inp_Aprr);
// printf ("\n");
// printf ("\n Beta_Inp = %13.12f:", Beta_Inp);
// printf ("\n");
Mist_Abs_Alfa = Alfa_Inp_Aprr - Alfa_Out_Corr;
Mist_Abs_Beta = Beta_Inp_Aprr - Beta_Out_Corr;
Accum_Square_Mist_Alfa = Accum_Square_Mist_Alfa + Mist_Abs_Alfa * Mist_Abs_Alfa;
Accum_Square_Mist_Beta = Accum_Square_Mist_Beta + Mist_Abs_Beta * Mist_Abs_Beta;
// printf ("\n Mist_Abs_Alfa = %13.12f:", Mist_Abs_Alfa);
// printf ("\n");
// printf ("\n Mist_Beta = %13.12f:", Mist_Abs_Beta);
// printf ("\n");
Calc_Step_Appr(Order_Appr, C, Delta_t, d_Alfa_dt_Inp, d_Beta_dt_Inp, Alfa_Inp, Beta_Inp,
&d_Alfa_dt_Out, &d_Beta_dt_Out, &Alfa_Out, &Beta_Out);
d_Alfa_dt_Inp = d_Alfa_dt_Out; Alfa_Inp = Alfa_Out;
d_Beta_dt_Inp = d_Beta_dt_Out; Beta_Inp = Beta_Out;
// printf ("\n Alfa_Out_Corr = %13.12f:", Alfa_Out_Corr);
// printf ("\n Beta_Out_Corr = %13.12f:", Beta_Out_Corr);
// printf ("\n");
// printf ("\n");
Accum_Square_Alfa = Accum_Square_Alfa + Alfa_Out_Corr * Alfa_Out_Corr;
Accum_Square_Beta = Accum_Square_Beta + Beta_Out_Corr * Beta_Out_Corr;
}
Divisor = (double)(Lim_Step_Int);
Ampl_Alfa_Effectiv = sqrt(Accum_Square_Alfa/Divisor);
Ampl_Beta_Effectiv = sqrt(Accum_Square_Beta/Divisor);
Mist_Square_Alfa_Abs = sqrt(Accum_Square_Mist_Alfa/Divisor);
Mist_Square_Beta_Abs = sqrt(Accum_Square_Mist_Beta/Divisor);
Mist_Square_Alfa_Rel = Mist_Square_Alfa_Abs/Ampl_Alfa_Effectiv;
Mist_Square_Beta_Rel = Mist_Square_Beta_Abs/Ampl_Beta_Effectiv;
// printf ("\n");
// printf ("\n");
printf ("\n Order_Appr = %2u", Order_Appr);
// printf ("\n");
// printf ("\n");
// printf ("\n Mist_Square_Alfa_Abs = %19.18f", Mist_Square_Alfa_Abs);
// printf ("\n");
// printf ("\n Mist_Square_Beta_Abs = %19.18f", Mist_Square_Beta_Abs);
// printf ("\n");
// printf ("\n");
// printf ("\n");
printf ("\n Mist_Square_Alfa_Rel = %19.18f", Mist_Square_Alfa_Rel);
// printf ("\n");
// printf ("\n");
printf ("\n Mist_Square_Beta_Rel = %19.18f", Mist_Square_Beta_Rel);
printf ("\n");
printf ("\n");
}
}
/*
printf ("\n");
printf ("\n PRINT TEST VALUE");
printf ("\n");
printf ("\n A0 = %13.12f", A0);
printf ("\n");
printf ("\n B0 = %13.12f", B0);
printf ("\n");
printf ("\n H = %13.12f", H);
printf ("\n");
printf ("\n L_Ksi = %13.12f", L_Ksi);
printf ("\n");
printf ("\n L_Gamma = %13.12f", L_Gamma);
printf ("\n");
printf ("\n");
printf ("\n");
printf ("\n");
// ВЫВОД НА ПЕЧАТЬ ВЫХОДНЫХ ВЕЛИЧИН
printf ("\n");
printf ("\n PRINT OUTPUT VALUE");
printf ("\n");
printf ("\n C00 := %13.12f:", C00);
printf ("\n");
printf ("\n C01 := %13.12f:", C01);
printf ("\n");
printf ("\n");
printf ("\n C10 := %13.12f:", C10);
printf ("\n");
printf ("\n C11 := %13.12f:", C11);
printf ("\n");
printf ("\n");
printf ("\n");
alpha[0]
A0
c00 := 12; c01 := -3; c10 := -7; c11 := 5; w0 := 23; e0 := 45; a0 := 24; b0 := -17;
diff(a(t), t) = w(t),
diff(w(t), t) = c00*e(t)+c10,
diff(b(t), t) = e(t)
diff(e(t), t) = c10*w(t)+c11,
НЕОБХОДИМЫЕ ФОРМУЛЫ ДЛЯ РАСЧЕТА
ЗАДАЮТСЯ ВЕЛИЧИНЫ
A_Plus_A1; A_Plus_B1; C1; A2; Beta0;
Cos_Beta0_Pow_2 = pow(cos(Beta0),2.);
Sin_Beta0_Pow_2 = pow(sin(Beta0),2.);
A0 = A_Plus_A1 * Cos_Beta0_Pow_2 + C1 * Sin_Beta0_Pow_2 + A2;
B0 = A_Plus_B1; H;
d2_Alfa_dt2 = C00 * d_Beta_dt + C01;
d2_Beta_dt2 = C10 * d_Alfa_dt + C11;
d3_Alfa_dt3 = C00 * d2_Beta_dt2;
d3_Beta_dt3 = C10 * d2_Alfa_dt2;
d4_Alfa_dt4 = C00 * d3_Beta_dt3;
d4_Beta_dt4 = C10 * d3_Alfa_dt3;
d_Alfa_dt, d2_Alfa_dt2, d3_Alfa_dt3, d4_Alfa_dt4, d_Beta_dt, d2_Beta_dt2, d3_Beta_dt3, d4_Beta_dt4;
*/