Лабораторная работа по "Программированию"
Автор: alinagazizova • Май 20, 2023 • Лабораторная работа • 394 Слов (2 Страниц) • 133 Просмотры
Постановка задачи:
[pic 1]
Результат работы программы
[pic 2]
[pic 3]
[pic 4] [pic 5]
Вывод:
Метод Эйлера-Коши требует маленький шаг, чтобы результаты исходных вычислений были точными, при большом шаге результаты будут не точные. Данный факт подтверждает сопоставление результатов данного метода с большим шагом с результатами RKF45.
Код программы:
#include <math.h> #include <stdio.h> #include "cmath.h" #include <locale.h> #define HPRINT 0.05
#define H_OPT 0.01
#define EPS 0.0001
#define N 2
const double Y0[N] = { -3.0, 1.0 }; double Y[N], YP[N];
int F(int n, double T, double* Y, double* YP);
int EulerCauchy(int(*F)(int n, double t, double y[], double yp[]), int NEQN, double Y[], double YP[], double* T, double H);
int main()
{
setlocale(LC_ALL, "Russian");
double H, T = 0.0, TOUT, RELERR = EPS, ABSERR = EPS; int NFE, MAXNFE = 1000, IFLAG = 1, NEQN = N, fail;
//first part: rkfinit(NEQN, &fail); if (fail)
{
printf("RKFINIT ERROR!\n"); exit(1);
}
printf("RKF45:\n\n"); Y[0] = Y0[0];
Y[1] = Y0[1];
printf("T: %.4f, Y : %.4f %.4f\n", T, Y[0], Y[1]); for (TOUT = HPRINT; TOUT < 1 + HPRINT; TOUT += HPRINT)
{
rkf45(F, NEQN, Y, YP, &T, TOUT, &RELERR, ABSERR, &H, &NFE, MAXNFE, &IFLAG);
if (IFLAG == 8) { printf("IFLAG ERROR!\n"); break; } printf("T: %.4f, Y : %.4f %.4f\n", T, Y[0], Y[1]);
}
printf("\nFLAG: %d, NFE: %d\n\n", IFLAG, NFE); rkfend();
//second part:
printf("\nМетодом Эйлера-Коши:\n"); H = HPRINT;
printf("\nSTEP = %.4f\n\n", H); Y[0] = Y0[0];
Y[1] = Y0[1];
for (T = H; T < 1 + H; T += H)
...