N
Nordic1962
Все поправил. Прога работает.
А теперь и еще одну слепил про метод Эйлера:
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <graphics.h>
#include <stdlib.h>
#define EPSILON 0.00001
#define MAXSTEP 1
// #define VERSION 1.43
// ---------------------------------------------------------- //
double f(double x, double y);
double do_step(double h, double x_cur, double y_cur);
void title(void);
void main(void);
double f(double x, double y)
{
// Right party DU f(x,y)
return (pow(2.718,x)*y);
}
// --------------------------------------------------------- //
void main(void)
{
int i;
int metka;
int flag = 0;
int metka1, metka2;
double err = 0;
double x0, y0;
double big2_step_res, super_step_res;
double k = 1;
double zoom = 1;
double big_step_res, small_step_res;
double a, b;
double temp;
double x_cur, y_cur;
double h;
double f_max = 0, f_min = 0;
double norma = 0; // Норма (для корректного масштабирования графика)
int c = 8; // Peremenn. color !!!
FILE *myfile;
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "");
textcolor(0);
setbkcolor(0);
title();
printf("y'=f(x,y), y(x0)=y(a)=y0, [a,b] - Integration piece.я\n");
label1: printf("\na=");
scanf("%lg", &a);
printf("b=");
scanf("%lg", &;
printf("y(%lg)=", a);
scanf("%lg", &y0);
title();
printf("[%lg,%lg] - Border Integrirov., y(%lg)=%lg - begin condition.\n", a, b, a, y0);
//============= Initialization =====================================
h = fabs(b - a) / 10;
if (h > 0.1) h = 0.1;
x_cur = a;
y_cur = y0;
f_max = y_cur;
f_min = y_cur;
myfile = fopen("rk4.txt", "w");
fprintf(myfile, "Program: Fokin.exe %g\n");
fprintf(myfile, "The order of method: 4\n");
fprintf(myfile, "Automatic integration step select: Enabled\n");
fprintf(myfile, "[a,b]=[%lg,%lg], y(%lg)=%lg\n", a, b, a, y0);
while (x_cur <= B)
{
if (flag > 1) break;
big_step_res = do_step(h, x_cur, y_cur);
temp = do_step(h / 2, x_cur, y_cur);
small_step_res = do_step(h / 2, x_cur + h / 2, temp);
err = fabs(big_step_res - small_step_res);
// Reduction of lenght of a step
if (err > EPSILON)
{
h = h / 2;
continue;
}
// Increase of lenght of a step
big2_step_res = do_step(h, x_cur + h, big_step_res);
super_step_res = do_step(2 * h, x_cur, y_cur);
if (fabs(big2_step_res - super_step_res) < EPSILON / 2)
{
h *= 2;
continue;
}
if (h > MAXSTEP) h = MAXSTEP;
// Защита от сбоев
if (h < pow(EPSILON, 2))
{
printf("Error!\n g(%lg)=", x_cur);
fprintf(myfile, "Error!\n g(%lg)=", x_cur);
if (y_cur < 0)
{
printf("-oo.\n");
fprintf(myfile, "-oo.\n");
}
else
{
printf("+oo.\n");
fprintf(myfile, "+oo.\n");
}
getch();
fclose(myfile);
exit(1);
}
printf("y(%lg)=%lg, err=%lg, h=%lg\n", x_cur, y_cur, err, h);
if (y_cur < f_min) f_min = y_cur;
if (y_cur > f_max) f_max = y_cur;
fprintf(myfile, "y(%lg)=%lg, h=%lg\n", x_cur, y_cur, h);
if (x_cur + h > B) h = fabs(b - x_cur);
x_cur += h;
y_cur = big_step_res;
if (x_cur >= B) flag++;
}
fclose(myfile);
printf("\n Tabl.--> rk4.txt.\n");
printf("\n Enter anikey for output grafic...");
flag = 0;
getch();
// Output grafic
cleardevice(); clrscr();
if (fabs(a) > fabs(B)) zoom = fabs(getmaxx() / 2 / a);
else zoom = fabs(getmaxx() / 2 / B);
//================ Pinting borders ======================
for (i = 0 ; i < getmaxy() ; i += 5)
{
if (c == 8) c = 0;
else c = 8;
setcolor©;
line(a * zoom + getmaxx() / 2, i, a * zoom + getmaxx() / 2, i + 5);
line(b * zoom + getmaxx() / 2 - 1, i, b * zoom + getmaxx() / 2 - 1, i + 5);
}
if (fabs(f_min) > fabs(f_max)) norma = fabs(f_min) * zoom;
else norma = fabs(f_max) * zoom;
//=============== Definition koefficient correction ============
k = (getmaxy() / 2) / norma;
//======== Zashita OT big mashtabirovan. ================
if (k < 0.0001) k = 0.0001;
if (k > 10000) k = 10000;
for (i = 0 ; i < getmaxx() ; i += 5)
{
if (c == 8) c = 0;
else c = 8;
setcolor©;
line(i, -y0 * zoom * k + getmaxy() / 2, i + 5, -y0 * zoom * k + getmaxy() / 2);
line(i, -f_min * zoom * k + getmaxy() / 2, i + 5, -f_min * zoom * k + getmaxy() / 2);
line(i, -f_max * zoom * k + getmaxy() / 2, i + 5, -f_max * zoom * k + getmaxy() / 2);
}
metka = ceil((-y0 * zoom * k + getmaxy() / 2) / 16);
if (metka <= 0) metka = 1;
if (metka == 15) metka = 16;
if (metka > 25) metka = 25;
gotoxy(1, metka);
printf("Y=%.2g", y0, metka);
metka = ceil((-f_max * zoom * k + getmaxy() / 2) / 16);
if (metka <= 0) metka = 1;
if (metka == 15) metka = 16;
if (metka > 25) metka = 25;
gotoxy(1, metka);
printf("Y=%.2lg", f_max, metka);
metka = ceil((-f_min * zoom * k + getmaxy() / 2) / 16);
if (metka <= 0) metka = 1;
if (metka == 15) metka = 16;
if (metka > 25) metka = 25;
gotoxy(1, metka);
printf("Y=%.2lg", f_min, metka);
// ======== Borders and axes coordinats =============
metka1 = ceil((a * zoom + getmaxx() / 2) / 8);
if (metka1 < 1) metka1 = 1;
if (metka1 > 75) metka1 = 75;
if (metka == 17) metka = 18;
gotoxy(metka1, 15);
if (a != 0) printf("%.2lg", a);
metka2 = ceil((b * zoom + getmaxx() / 2 - 1) / 8);
if (metka2 - metka1 < 7) metka2 = metka1 + 7;
if (metka2 < 1) metka2 = 1;
if (metka2 > 75) metka2 = 75;
gotoxy(metka2, 15);
printf("%.2lg", B);
gotoxy(80, 17);
printf("X");
gotoxy(42,1);
printf("Y");
gotoxy(39, 15);
printf("0");
//========= Pinting axes coordinats ==================
setcolor(15);
line(0, getmaxy() / 2, getmaxx(), getmaxy() / 2);
line(getmaxx() / 2, 0, getmaxx() / 2, getmaxy());
line(getmaxx() / 2, 0, getmaxx() / 2 - 5, 10);
line(getmaxx() / 2, 0, getmaxx() / 2 + 5, 10);
line(getmaxx(), getmaxy() / 2, getmaxx() - 10, getmaxy() / 2 + 5);
line(getmaxx(), getmaxy() / 2, getmaxx() - 10, getmaxy() / 2 - 5);
setcolor(10);
h = fabs(b - a) / 10;
if (h > 0.1) h = 0.1;
y_cur = y0;
x_cur = a;
f_max = y_cur;
f_min = y_cur;
x0 = zoom * a + getmaxx() / 2;
y0 = (zoom * (-y_cur)) * k + getmaxy() / 2;
while (x_cur <= B)
{
if (flag > 1) break;
big_step_res = do_step(h, x_cur, y_cur);
temp = do_step(h / 2, x_cur, y_cur);
small_step_res = do_step(h / 2, x_cur + h / 2, temp);
err = fabs(big_step_res - small_step_res);
if (err > EPSILON)
{
h = h / 2;
continue;
}
big2_step_res = do_step(h, x_cur + h, big_step_res);
super_step_res = do_step(2 * h, x_cur, y_cur);
if (fabs(big2_step_res - super_step_res) < EPSILON / 2)
{
h *= 2;
continue;
}
if (h > MAXSTEP) h = MAXSTEP;
line (x0, y0, zoom * x_cur + getmaxx() / 2, zoom * (-y_cur) * k + getmaxy() / 2);
x0 = zoom * (x_cur) + getmaxx() / 2;
y0 = (zoom * (-y_cur)) * k + getmaxy() / 2;
if (x_cur + h > B) h = fabs(b - x_cur);
x_cur += h;
y_cur = big_step_res;
if (x_cur >= B) flag++;
}
while (getch() != 0);
}
// --------------------------------------------------------- //
void title(void)
{
// ============== Printing header of programm ===================
cleardevice(); clrscr();
printf(" The desition of the differential equation Euler's method \n");
printf("____________________________________________________\n");
}
// --------------------------------------------------------- //
double do_step(double h, double x_cur, double y_cur)
{
double k1, k2, k3, k4, delta_y_cur;
k1 = f(x_cur, y_cur);
k2 = f(x_cur + (h / 2), y_cur + (h / 2) * k1);
k3 = f(x_cur + (h / 2), y_cur + (h / 2) * k2);
k4 = f(x_cur + h, y_cur + h * k3);
delta_y_cur = (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);
return(y_cur + delta_y_cur);
}
Добавлено:
Смайлики сами возникли !!!!!!!!!!!!!!! ))
А теперь и еще одну слепил про метод Эйлера:
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <graphics.h>
#include <stdlib.h>
#define EPSILON 0.00001
#define MAXSTEP 1
// #define VERSION 1.43
// ---------------------------------------------------------- //
double f(double x, double y);
double do_step(double h, double x_cur, double y_cur);
void title(void);
void main(void);
double f(double x, double y)
{
// Right party DU f(x,y)
return (pow(2.718,x)*y);
}
// --------------------------------------------------------- //
void main(void)
{
int i;
int metka;
int flag = 0;
int metka1, metka2;
double err = 0;
double x0, y0;
double big2_step_res, super_step_res;
double k = 1;
double zoom = 1;
double big_step_res, small_step_res;
double a, b;
double temp;
double x_cur, y_cur;
double h;
double f_max = 0, f_min = 0;
double norma = 0; // Норма (для корректного масштабирования графика)
int c = 8; // Peremenn. color !!!
FILE *myfile;
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "");
textcolor(0);
setbkcolor(0);
title();
printf("y'=f(x,y), y(x0)=y(a)=y0, [a,b] - Integration piece.я\n");
label1: printf("\na=");
scanf("%lg", &a);
printf("b=");
scanf("%lg", &;
printf("y(%lg)=", a);
scanf("%lg", &y0);
title();
printf("[%lg,%lg] - Border Integrirov., y(%lg)=%lg - begin condition.\n", a, b, a, y0);
//============= Initialization =====================================
h = fabs(b - a) / 10;
if (h > 0.1) h = 0.1;
x_cur = a;
y_cur = y0;
f_max = y_cur;
f_min = y_cur;
myfile = fopen("rk4.txt", "w");
fprintf(myfile, "Program: Fokin.exe %g\n");
fprintf(myfile, "The order of method: 4\n");
fprintf(myfile, "Automatic integration step select: Enabled\n");
fprintf(myfile, "[a,b]=[%lg,%lg], y(%lg)=%lg\n", a, b, a, y0);
while (x_cur <= B)
{
if (flag > 1) break;
big_step_res = do_step(h, x_cur, y_cur);
temp = do_step(h / 2, x_cur, y_cur);
small_step_res = do_step(h / 2, x_cur + h / 2, temp);
err = fabs(big_step_res - small_step_res);
// Reduction of lenght of a step
if (err > EPSILON)
{
h = h / 2;
continue;
}
// Increase of lenght of a step
big2_step_res = do_step(h, x_cur + h, big_step_res);
super_step_res = do_step(2 * h, x_cur, y_cur);
if (fabs(big2_step_res - super_step_res) < EPSILON / 2)
{
h *= 2;
continue;
}
if (h > MAXSTEP) h = MAXSTEP;
// Защита от сбоев
if (h < pow(EPSILON, 2))
{
printf("Error!\n g(%lg)=", x_cur);
fprintf(myfile, "Error!\n g(%lg)=", x_cur);
if (y_cur < 0)
{
printf("-oo.\n");
fprintf(myfile, "-oo.\n");
}
else
{
printf("+oo.\n");
fprintf(myfile, "+oo.\n");
}
getch();
fclose(myfile);
exit(1);
}
printf("y(%lg)=%lg, err=%lg, h=%lg\n", x_cur, y_cur, err, h);
if (y_cur < f_min) f_min = y_cur;
if (y_cur > f_max) f_max = y_cur;
fprintf(myfile, "y(%lg)=%lg, h=%lg\n", x_cur, y_cur, h);
if (x_cur + h > B) h = fabs(b - x_cur);
x_cur += h;
y_cur = big_step_res;
if (x_cur >= B) flag++;
}
fclose(myfile);
printf("\n Tabl.--> rk4.txt.\n");
printf("\n Enter anikey for output grafic...");
flag = 0;
getch();
// Output grafic
cleardevice(); clrscr();
if (fabs(a) > fabs(B)) zoom = fabs(getmaxx() / 2 / a);
else zoom = fabs(getmaxx() / 2 / B);
//================ Pinting borders ======================
for (i = 0 ; i < getmaxy() ; i += 5)
{
if (c == 8) c = 0;
else c = 8;
setcolor©;
line(a * zoom + getmaxx() / 2, i, a * zoom + getmaxx() / 2, i + 5);
line(b * zoom + getmaxx() / 2 - 1, i, b * zoom + getmaxx() / 2 - 1, i + 5);
}
if (fabs(f_min) > fabs(f_max)) norma = fabs(f_min) * zoom;
else norma = fabs(f_max) * zoom;
//=============== Definition koefficient correction ============
k = (getmaxy() / 2) / norma;
//======== Zashita OT big mashtabirovan. ================
if (k < 0.0001) k = 0.0001;
if (k > 10000) k = 10000;
for (i = 0 ; i < getmaxx() ; i += 5)
{
if (c == 8) c = 0;
else c = 8;
setcolor©;
line(i, -y0 * zoom * k + getmaxy() / 2, i + 5, -y0 * zoom * k + getmaxy() / 2);
line(i, -f_min * zoom * k + getmaxy() / 2, i + 5, -f_min * zoom * k + getmaxy() / 2);
line(i, -f_max * zoom * k + getmaxy() / 2, i + 5, -f_max * zoom * k + getmaxy() / 2);
}
metka = ceil((-y0 * zoom * k + getmaxy() / 2) / 16);
if (metka <= 0) metka = 1;
if (metka == 15) metka = 16;
if (metka > 25) metka = 25;
gotoxy(1, metka);
printf("Y=%.2g", y0, metka);
metka = ceil((-f_max * zoom * k + getmaxy() / 2) / 16);
if (metka <= 0) metka = 1;
if (metka == 15) metka = 16;
if (metka > 25) metka = 25;
gotoxy(1, metka);
printf("Y=%.2lg", f_max, metka);
metka = ceil((-f_min * zoom * k + getmaxy() / 2) / 16);
if (metka <= 0) metka = 1;
if (metka == 15) metka = 16;
if (metka > 25) metka = 25;
gotoxy(1, metka);
printf("Y=%.2lg", f_min, metka);
// ======== Borders and axes coordinats =============
metka1 = ceil((a * zoom + getmaxx() / 2) / 8);
if (metka1 < 1) metka1 = 1;
if (metka1 > 75) metka1 = 75;
if (metka == 17) metka = 18;
gotoxy(metka1, 15);
if (a != 0) printf("%.2lg", a);
metka2 = ceil((b * zoom + getmaxx() / 2 - 1) / 8);
if (metka2 - metka1 < 7) metka2 = metka1 + 7;
if (metka2 < 1) metka2 = 1;
if (metka2 > 75) metka2 = 75;
gotoxy(metka2, 15);
printf("%.2lg", B);
gotoxy(80, 17);
printf("X");
gotoxy(42,1);
printf("Y");
gotoxy(39, 15);
printf("0");
//========= Pinting axes coordinats ==================
setcolor(15);
line(0, getmaxy() / 2, getmaxx(), getmaxy() / 2);
line(getmaxx() / 2, 0, getmaxx() / 2, getmaxy());
line(getmaxx() / 2, 0, getmaxx() / 2 - 5, 10);
line(getmaxx() / 2, 0, getmaxx() / 2 + 5, 10);
line(getmaxx(), getmaxy() / 2, getmaxx() - 10, getmaxy() / 2 + 5);
line(getmaxx(), getmaxy() / 2, getmaxx() - 10, getmaxy() / 2 - 5);
setcolor(10);
h = fabs(b - a) / 10;
if (h > 0.1) h = 0.1;
y_cur = y0;
x_cur = a;
f_max = y_cur;
f_min = y_cur;
x0 = zoom * a + getmaxx() / 2;
y0 = (zoom * (-y_cur)) * k + getmaxy() / 2;
while (x_cur <= B)
{
if (flag > 1) break;
big_step_res = do_step(h, x_cur, y_cur);
temp = do_step(h / 2, x_cur, y_cur);
small_step_res = do_step(h / 2, x_cur + h / 2, temp);
err = fabs(big_step_res - small_step_res);
if (err > EPSILON)
{
h = h / 2;
continue;
}
big2_step_res = do_step(h, x_cur + h, big_step_res);
super_step_res = do_step(2 * h, x_cur, y_cur);
if (fabs(big2_step_res - super_step_res) < EPSILON / 2)
{
h *= 2;
continue;
}
if (h > MAXSTEP) h = MAXSTEP;
line (x0, y0, zoom * x_cur + getmaxx() / 2, zoom * (-y_cur) * k + getmaxy() / 2);
x0 = zoom * (x_cur) + getmaxx() / 2;
y0 = (zoom * (-y_cur)) * k + getmaxy() / 2;
if (x_cur + h > B) h = fabs(b - x_cur);
x_cur += h;
y_cur = big_step_res;
if (x_cur >= B) flag++;
}
while (getch() != 0);
}
// --------------------------------------------------------- //
void title(void)
{
// ============== Printing header of programm ===================
cleardevice(); clrscr();
printf(" The desition of the differential equation Euler's method \n");
printf("____________________________________________________\n");
}
// --------------------------------------------------------- //
double do_step(double h, double x_cur, double y_cur)
{
double k1, k2, k3, k4, delta_y_cur;
k1 = f(x_cur, y_cur);
k2 = f(x_cur + (h / 2), y_cur + (h / 2) * k1);
k3 = f(x_cur + (h / 2), y_cur + (h / 2) * k2);
k4 = f(x_cur + h, y_cur + h * k3);
delta_y_cur = (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);
return(y_cur + delta_y_cur);
}
Добавлено:
Смайлики сами возникли !!!!!!!!!!!!!!! ))