Перейти к содержимому

Фотография

Ошибка в Turbo C, при создании EXE-шника


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 13

#1 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 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.
  • 0

#2 Vasiliy

Vasiliy

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 2 959 сообщений
  • ФИО:Касимов Василий
  • Город:Москва

Отправлено 20 декабря 2011 - 06:47

Что-то неопределено.
Не пытались выполнить код из справки по разделу графика? Чтобы на минимальном наборе операций и подключаемых файлах проверить.
  • 0

#3 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 21 декабря 2011 - 06:15

Что-то неопределено.
Не пытались выполнить код из справки по разделу графика? Чтобы на минимальном наборе операций и подключаемых файлах проверить.


Я сделал Options -> Linker -> Libraries -> [X] Graphics library, после этого EXE-шник создался таки, но прога не выводит график, лишь темный экран и выход сразу, без нажатия клавиши (хотя ест getch();. И путь прописал как положено: initgraph(&gdriver, &gmode, "C:\\BORLANDC\\bgi\\");
  • 0

#4 Vasiliy

Vasiliy

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 2 959 сообщений
  • ФИО:Касимов Василий
  • Город:Москва

Отправлено 21 декабря 2011 - 11:00

А вы ошибки перехода в графический режим обрабатываете?
  • 0

#5 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 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();
}
  • 0

#6 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 22 декабря 2011 - 07:47

А в этом коде вообще Yp присваивается какая-то загадочная переменная d..... откуда она берется???


#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();
}
  • 0

#7 D2Phoenix

D2Phoenix

    Постоянный участник

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 22 декабря 2011 - 08:06

А что вы хотите?)
h=ts/10;
ts не инициализирована)

А в этом коде вообще Yp присваивается какая-то загадочная переменная d

Чёт не вижу такого в этом коде)

Да, но теперь другая проблема - все переменные почему-то :=null

?)

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();
}

Бесмысленная проверка в случае ошибки всё равно будет пытаться выполнить код программы(в else весь код прорисовки нужно перенести)

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();
}

  • 1

#8 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 23 декабря 2011 - 12:33

А что вы хотите?)

h=ts/10;
ts не инициализирована)

А в этом коде вообще Yp присваивается какая-то загадочная переменная d

Чёт не вижу такого в этом коде)

Да, но теперь другая проблема - все переменные почему-то :=null

?)

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();
}

Бесмысленная проверка в случае ошибки всё равно будет пытаться выполнить код программы(в else весь код прорисовки нужно перенести)

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();
}
  • 0

#9 D2Phoenix

D2Phoenix

    Постоянный участник

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 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 получится)
  • 0

#10 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 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);
}
  • 0

#11 Vasiliy

Vasiliy

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 2 959 сообщений
  • ФИО:Касимов Василий
  • Город:Москва

Отправлено 26 декабря 2011 - 08:31

Nordic1962, пользуйтесь тегом code, когда публикуете такие листинги, пожалуйста. Тогда читать их будет гораздо легче.
И отступы в коде тоже не помешают.
  • 0

#12 D2Phoenix

D2Phoenix

    Постоянный участник

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 26 декабря 2011 - 09:36

Уже все работает, спасибо!

А вот еще слепил прогу:

И в чём вопрос?
  • 0

#13 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 27 декабря 2011 - 05:13


Уже все работает, спасибо!

А вот еще слепил прогу:

И в чём вопрос?


Была проблемка... но уже решил. :)

Всем кто отозвался - огромное СПАСИБО за помощь!

С наступающим роковым 2012-м !

Удачи и всех благ в Новом Году!
  • 0

#14 Nordic1962

Nordic1962

    Новый участник

  • Members
  • Pip
  • 8 сообщений

Отправлено 27 декабря 2011 - 07:17

[quote name='D2Phoenix' timestamp='1324892210' post='99151']
[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);
}
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных