Ошибка в Turbo C, при создании EXE-шника
#1
Отправлено 20 декабря 2011 - 05:25
Есть код:
#include <graphics.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <stdio.h>
void main()
{
int gmode=VGAHI, gdriver=DETECT;
int Xp=0, Yp=1;
float XX,YY,t,tp,ts,tk,k,h,kt;
initgraph(&gdriver, &gmode, "C:\\tc\\bgi\\");
t=0;
tk=0,25;
t=0,001;
h=ts/10;
kt=640/tk;
do
{
XX=(10+sin(100+2+3.1415*t));
if (XX > 50) XX = 50;
if (XX <-50) XX = -50;
Yp=(k+XX-YY)/ts;
setcolor(0);
line(t, 240-XX, 320+tp, 240+Xp);
setcolor(15);
line(t+kt, 240, tp+kt, 240-XX);
setcolor(14);
line(t+kt, 240, tp+kt, 240-XX);
tp=t;
Xp=XX;
Yp=YY;
YY=h;
YY=Yp+1;
}
while(t < tk);
getch();
}
Код должен выводить три графика разных цветов согласно формуле. При компиляции вроде не находит ошибок, а при линковке в исполнямый файл выдает Undefinite symbol: _line; _setcolor; _initgraph.
#2
Отправлено 20 декабря 2011 - 06:47
Не пытались выполнить код из справки по разделу графика? Чтобы на минимальном наборе операций и подключаемых файлах проверить.
#3
Отправлено 21 декабря 2011 - 06:15
Что-то неопределено.
Не пытались выполнить код из справки по разделу графика? Чтобы на минимальном наборе операций и подключаемых файлах проверить.
Я сделал Options -> Linker -> Libraries -> [X] Graphics library, после этого EXE-шник создался таки, но прога не выводит график, лишь темный экран и выход сразу, без нажатия клавиши (хотя ест getch();. И путь прописал как положено: initgraph(&gdriver, &gmode, "C:\\BORLANDC\\bgi\\");
#4
Отправлено 21 декабря 2011 - 11:00
#5
Отправлено 22 декабря 2011 - 07:33
А вы ошибки перехода в графический режим обрабатываете?
Да, но теперь другая проблема - все переменные почему-то :=null
#include <graphics.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
int errorcode;
int gmode=VGAHI, gdriver=DETECT;
int Xp=0, Yp=1;
float XX,YY,t,tp,ts,tk,k,h,kt;
initgraph(&gdriver, &gmode, "C:\\borlandc\\bgi\\");
errorcode = graphresult();
if ( errorcode != grOk ) {
printf( "Graphics error: %s\n", grapherrormsg( errorcode ) );
printf( "Press any key to halt:" );
getch();
}
else {
printf( "\n");
printf( "Graphics OK!");
printf( "\n");
printf( "Press any key to halt:" );
getch();
}
tk=0.25;
t=0.001;
h=ts/10;
kt=640/tk;
ts=0.2;
do
{
XX=(10+sin(100+2+3.1415*t));
if (XX > 50) XX = 50;
if (XX <-50) XX = -50;
Yp=(k+XX-YY)/ts;
setcolor(0);
line(t, 240-XX, 320+tp, 240+Xp);
setcolor(15);
line(t+kt, 240, tp+kt, 240-XX);
setcolor(14);
line(t+kt, 240, tp+kt, 240-XX);
tp=t;
Xp=XX;
Yp=YY;
YY=h;
YY=Yp+1;
t=t+0.9;
printf( "\n");
printf( "XX = : %s\n",XX);
printf( "t = : %s\n",t );
printf( "Yp = : %s\n",Yp);
getch();
}
while(t < tk);
getch();
}
#6
Отправлено 22 декабря 2011 - 07:47
#include <graphics.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
int errorcode;
int gmode=VGAHI, gdriver=DETECT;
int Xp=0, Yp=1;
float XX,YY,t,tp,ts,tk,k,h,kt;
initgraph(&gdriver, &gmode, "C:\\borlandc\\bgi\\");
errorcode = graphresult();
if ( errorcode != grOk ) {
printf( "Graphics error: %s\n", grapherrormsg( errorcode ) );
printf( "Press any key to halt:" );
getch();
}
else {
printf( "\n");
printf( "Graphics OK!");
printf( "\n");
printf( "Press any key to halt:" );
getch();
}
tk=0.25;
t=0.001;
h=ts/10;
kt=640/tk;
ts=0.2;
printf( "\n");
printf( "XX = : %s\n",XX);
printf( "YY = : %s\n",YY);
printf( "t = : %s\n",t);
printf( "kt = : %s\n",kt);
printf( "tp = : %s\n",tp);
printf( "Xp = : %s\n",Xp);
printf( "Yp = : %s\n",Yp);
printf( "h = : %s\n",h);
printf( "\n");
getch();
do
{
XX=(10+sin(100+2+3.1415*t));
if (XX > 50) XX = 50;
if (XX <-50) XX = -50;
Yp=(k+XX-YY)/ts;
setcolor(0);
line(t, 240-XX, 320+tp, 240+Xp);
setcolor(15);
line(t+kt, 240, tp+kt, 240-XX);
setcolor(14);
line(t+kt, 240, tp+kt, 240-XX);
tp=t;
Xp=XX;
Yp=YY;
YY=h;
YY=Yp+1;
t=t+0.1;
printf( "\n");
printf( "XX = : %s\n",XX);
printf( "YY = : %s\n",YY);
printf( "t = : %s\n",t);
printf( "kt = : %s\n",kt);
printf( "tp = : %s\n",tp);
printf( "Xp = : %s\n",Xp);
printf( "Yp = : %s\n",Yp);
printf( "h = : %s\n",h);
printf( "\n");
getch();
}
while(t < tk);
getch();
}
#7
Отправлено 22 декабря 2011 - 08:06
h=ts/10;ts не инициализирована)
Чёт не вижу такого в этом коде)А в этом коде вообще Yp присваивается какая-то загадочная переменная d
?)Да, но теперь другая проблема - все переменные почему-то :=null
Бесмысленная проверка в случае ошибки всё равно будет пытаться выполнить код программы(в else весь код прорисовки нужно перенести)if ( errorcode != grOk ) { printf( "Graphics error: %s\n", grapherrormsg( errorcode ) ); printf( "Press any key to halt:" ); getch(); } else { printf( "\n"); printf( "Graphics OK!"); printf( "\n"); printf( "Press any key to halt:" ); getch(); }
А это что за эпик?)Yp=YY; YY=h; YY=Yp+1;
зы. не проще с нуля всё написать)) а не разбираться в этом быдло коде)
зы2. И чтоб убедиться что у вас с компилятором всё в порядке. Эта штука должна работать:
#include<graphics.h> #include<conio.h> void main() { int gd=DETECT, gm; initgraph(&gd, &gm, "c:\\turboc3\\bgi " ); circle(200,100,150); getch(); closegraph(); }
#8
Отправлено 23 декабря 2011 - 12:33
А что вы хотите?)
h=ts/10;ts не инициализирована)Чёт не вижу такого в этом коде)А в этом коде вообще Yp присваивается какая-то загадочная переменная d
?)Да, но теперь другая проблема - все переменные почему-то :=null
Бесмысленная проверка в случае ошибки всё равно будет пытаться выполнить код программы(в else весь код прорисовки нужно перенести)if ( errorcode != grOk ) { printf( "Graphics error: %s\n", grapherrormsg( errorcode ) ); printf( "Press any key to halt:" ); getch(); } else { printf( "\n"); printf( "Graphics OK!"); printf( "\n"); printf( "Press any key to halt:" ); getch(); }А это что за эпик?)Yp=YY; YY=h; YY=Yp+1;
зы. не проще с нуля всё написать)) а не разбираться в этом быдло коде)
зы2. И чтоб убедиться что у вас с компилятором всё в порядке. Эта штука должна работать:#include<graphics.h> #include<conio.h> void main() { int gd=DETECT, gm; initgraph(&gd, &gm, "c:\\turboc3\\bgi " ); circle(200,100,150); getch(); closegraph(); }
Работает, но теперь иная проблема: Yp=(k+XX-YY)/ts Yp=(10+10-0)/1 должно быть == 20, а прога выдает == 0 странно...???
#include <graphics.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
int errorcode;
int i,gmode=VGAHI, gdriver=DETECT;
int Xp=0, Yp=1;
float XX,YY,t,tp,ts,tk,k,h,kt;
initgraph(&gdriver, &gmode, "C:\\borlandc\\bgi\\");
errorcode = graphresult();
if ( errorcode != grOk ) {
printf( "Graphics error: %s\n", grapherrormsg( errorcode ) );
printf( "Press any key to halt:" );
getch();
}
else {
printf( "\n");
printf( "Graphics OK!");
printf( "\n");
printf( "Press any key to halt:" );
getch();
}
circle(420,200,100);
circle(420,200,80);
circle(420,200,60);
circle(420,200,40);
getch();
tk=0.25;
t=0.001;
h=ts/10;
kt=640/tk;
ts=1;
k=10.0;
printf( "\n");
printf( "tk = : %f\n",tk);
printf( "t = : %f\n",t);
printf( "h = : %f\n",h);
printf( "kt = : %f\n",kt);
printf( "\n");
printf( "tp = : %f\n",tp);
printf( "Xp = : %f\n",Xp);
printf( "\n");
getch();
do
{
XX=(10+sin(100+2+3.1415*t));
/*Proverka peremennix t and XX*/
printf( "\n");
printf( "t = : %f\n",t);
printf( "XX=10+sin(100+2+3.1415*t) = : %f\n",XX);
if (XX > 50) XX = 50;
if (XX <-50) XX = -50;
Yp=(k+XX-YY)/ts;
/*Proverka peremennix k,ts,Yp*/
printf( "k = : %f\n",k);
printf( "ts = : %f\n",ts);
printf( "YY = : %f\n",YY);
printf( "\n");
printf( "Yp=(k+XX-YY)/ts= : %f\n",Yp);
setcolor(0);
line(t, 240-XX, 320+tp, 240+Xp);
setcolor(15);
line(t+kt, 240, tp+kt, 240-XX);
setcolor(14);
line(t+kt, 240, tp+kt, 240-XX);
tp=t;
Xp=XX;
Yp=YY;
YY=h;
YY=Yp+1;
t=t+0.1;
getch();
}
while(t < tk);
getch();
closegraph();
}
#9
Отправлено 23 декабря 2011 - 13:16
Ещё раз:
Бессмыслица 1
Yp=YY; YY=h; YY=Yp+1;тоже самое что
YY = YY + 1;Бессмыслица 2
Как вы можете получить -50 < XX или > 50?
XX=(10+sin(100+2+3.1415*t)); if (XX > 50) XX = 50; if (XX <-50) XX = -50;
Yp=(k+XX-YY)/ts Yp=(10+10-0)/1 должно быть == 20,
Уверены?) YY не проинициализирована) так что таки 0 получится)
#10
Отправлено 26 декабря 2011 - 08:02
А вот еще слепил прогу:
#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", &b);
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);
}
#11
Отправлено 26 декабря 2011 - 08:31
И отступы в коде тоже не помешают.
#12
Отправлено 26 декабря 2011 - 09:36
И в чём вопрос?Уже все работает, спасибо!
А вот еще слепил прогу:
#13
Отправлено 27 декабря 2011 - 05:13
И в чём вопрос?
Уже все работает, спасибо!
А вот еще слепил прогу:
Была проблемка... но уже решил. :)
Всем кто отозвался - огромное СПАСИБО за помощь!
С наступающим роковым 2012-м !
Удачи и всех благ в Новом Году!
#14
Отправлено 27 декабря 2011 - 07:17
[quote name='Nordic1962' timestamp='1324886571' post='99146']
Уже все работает, спасибо!
Рано я возрадовался! Ниже приведенный код ПОЛНОСТЬЮ работает только почему-то под запущенным компилятором. Когда запускаю прогу даже прсто в папке BIN - нифига не работает полностью (не выводятся последние 3 графика).... sad.gif
#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
/*====== Parametrs ============================*/
// kpz=10.0; /* zveno */
// chs=1; /* 1 MHz*/
// cnt=1; /* 1 mks*/
// xi=0.5;*/
/*t=xx;
ht=yy;*/
/*====== Calculations ============================*/
// q = 1/chs;
// ips = xi * q;
// lmb = q * sqrt(1- xi*xi);
// yy =kpz*(1-M_E/(-ips*xx)*(cos(lmb*xx*M_PI)+ips/lmb*sin(lmb*xx*M_PI)))*1*xx;
// int s;
// xx=0.1;
//-----------------------------------------------------------------
double f(double x, double y);
double do_step(double h, double x_cur, double y_cur);
void main(void);
//float xx,yy,kpz,chs,cnt,t,xi,q,ips,lmb;
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);
printf("\n\n");
printf("============ Euler's method ================ \n");
printf("\n");
printf("=========Programm F_Euler.exe ================ \n");
printf("\n");
printf("-----------------------------------------------\n");
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", &b);
printf("y(%lg)=", a);
scanf("%lg", &y0);
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;
// Profit of break !!!
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);
delay(150);
}
delay(2500);
float xx,yy,kpz,chs,cnt,t,xi,q,ips,lmb;
/*====== Parametrs ============================*/
kpz=10.0; /* zveno */
chs=1; /* 1 MHz*/
cnt=1; /* 1 mks*/
xi=0.5;
/*t=xx;
ht=yy;*/
/*====== Calculations ============================*/
q = 1/chs;
ips = xi * q;
lmb = q * sqrt(1- xi*xi);
yy =kpz*(1-M_E/(-ips*xx)*(cos(lmb*xx*M_PI)+ips/lmb*sin(lmb*xx*M_PI)))*1*xx;
int s;
xx=0.1;
/* =========== Graph ============== */
for(s=10; s>0; s--)
{
yy = kpz*(1-M_E/(-ips*xx)*(cos(lmb*xx*M_PI)+ips/lmb*(sin(lmb*xx)*M_PI)))*1*xx;
setcolor(14);
line(xx,240-xx, 328+cnt,240+xx);
setcolor(15);
line(yy+cnt,240, xx+cnt,240-xx);
setcolor(0);
line(yy+cnt,200, xx+cnt,200-xx);
xx=xx+M_PI*cnt;
}
/*====== Axes of coordinats ============================*/
setcolor(0);
cleardevice(); clrscr();
setcolor(15);
arc (127,93,18,155,50);
arc (220,77,190,340,42);
arc (308,86,15,167,43);
arc (400,68,205,350,50);
arc (98,230,5,155,50);
arc (191,215,190,340,42);
arc (279,223,15,167,43);
arc (371,207,205,350,49);
arc (108,320,0,175,30);
line(139,321,145,351);
arc (183,338,200,355,40);
arc (256,327,-5,175,30);
line(226,326,223,343);
line(286,331,286,336);
arc (329,335,178,345,42);
line(374,330,369,350);
setcolor(14);
line(88,75,102,41);
line(102,41,162,41);
line(162,41,192,121);
line(192,121,250,121);
line(250,121,279,41);
line(278,41,337,41);
line(337,41,367,121);
line(365,121,422,121);
line(421,121,440,71);
line(57,210,71,178);
line(71,178,133,178);
line(133,178,163,260);
line(163,259,221,259);
line(221,259,248,178);
line(248,178,308,178);
line(308,178,338,259);
line(338,259,391,259);
line(391,259,410,209);
setcolor(15);
line(24,10,24,387);
line(10,122,430,122);
line(10,260,430,260);
line(10,380,430,380);
getch();
closegraph();
}
// --------------------------------------------------------- //
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);
}
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных