Главная страница

Курсовая Использование аттракторов. Использование аттракторов


Скачать 367.67 Kb.
НазваниеИспользование аттракторов
Дата15.05.2023
Размер367.67 Kb.
Формат файлаdocx
Имя файлаКурсовая Использование аттракторов.docx
ТипКурсовая
#1130346
страница3 из 4
1   2   3   4

Аттрактор Уэды


Один из первых примеров хаоса в электрических цепях был открыт Уэдой в цепи с нелинейным индуктивным элементом. Цепь с нелинейной индуктивностью и линейным сопротивлением, возбуждаемая гармонической электродвижущей силой, описывается уравнением

)

которое является частным случаем уравнения Дуффинга. С помощью аналогового и численного моделирования Уэда, сотрудник университета Киото в Японии, получил интересную визуализацию отображений Пуанкаре, описывающую хаотическую динамику этого уравнения. Уравнения этой модели, записанные в виде системы уравнений первого порядка, имеют вид




Алгоритм и программа


Для разработки программы был выбран язык программирования C++ и среда программирования Microsoft Visual Studio 2017.

Код программы:
#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

#include

#include
using namespace std;

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//otrisovka-------------------------------------------------------------------------------------------------

static float angle = 0; // кут повороту фігур

int width = 1, height = 1;

int button = -1; // кнопка миші (-1 - не натиснутa, 0 - ліва, 2 - права)

float angleX, angleY; // поточний кут повороту сцени

float zm;

float mouseX, mouseY; // поточні координати

float distZ = 0; // відстань по осі Z до сцени

//otrisovka---------------------------------------------------------------------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//kkk------------------------------------------------------------------------------------------------------------------

float hk = 0.05, xnk, ynk, znk, qk = 10, rk = 28, xk, yk, zk, tk, bk = 8 / 3;

int nk = 10000;

//kkk-----------------------------------------------------------------------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//dl'a formulx----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

struct diya {

float * q;

float * w;

float * r;

float(*f)(float q, float w);

};

diya sdiy[50], sdix[50], sdiz[50]; //struktura funkcxy

int tfx = 0, tfy = 0, tfz = 0; //koliqestvo funkcxy

float bqisel[20]; //bufer qisel

//dl'a formulx-----------------------------------------------------------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//dl'a vvoda--------------------------------------------------------------------------------------------------------------------------------

float* uvum; //kkk bufer dl'a constant

int vvod = 0; //status vvoda

float bust = 0; //kkk bust uveliq'eniya constant

char *a = new char[200]; //bufer dl'a vvoda

char *ba = new char[10];

int teka = 0; //polojeniye karetki a

//dl'a vvoda----------------------------------------------------------------------------------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//dl'a obratnogo vvoda--------------------------------------------------

char *itog = new char[200]; //dl'a oratnoy formulx

char *stek = new char[50]; //stek funkcxy

int pstek[50]; //prioritet funkcxy steka

int flag; //0-cifra 1-toqka 2-x 3-operator i ( 4-)

int skobki, toqki; //kolvo skobok i tiqek

int j, k; //j t'ekuw'iy el'em'ent itog;stek

//dl'a obratnogo vvoda--------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//dl'a ploskosti--------------------------------------------------

void(*tekpaint)();

int flagploskosti = 0;// 1 - risuet; 0 - net ; 2 - proekcxxya x ; 3 - y ; 4 - z

int rejxmploskosti = 1;// 1 - norma; 2 - proekcxxya x ; 3 - y ; 4 - z

int flagproekcxi[4] = { 1,1,1,1 };
struct Vctr3

{

float x; float y; float z;

};

float skalarnoye(Vctr3 a, Vctr3 b) { return (a.x*b.x + a.y*b.y + a.z*b.z); }

Vctr3 raznicaVctr3(Vctr3 a, Vctr3 b) { a.x -= b.x; a.y -= b.y; a.z -= b.z; return (a); }

Vctr3 sumaVctr3(Vctr3 a, Vctr3 b) { a.x += b.x; a.y += b.y; a.z += b.z; return (a); }

Vctr3 proizvVctr3(Vctr3 a, float b) { a.x *= b; a.y *= b; a.z *= b; return (a); }

Vctr3 normal, point, nmp,start;

Vctr3 uglx[4];
int znakploskosti = 1;

//dl'a ploskosti--------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

float Plus(float q, float w) { return q + w; }

float Minus(float q, float w) { return q - w; }

float Umnojxt(float q, float w) { return q * w; }

float Delit(float q, float w) { return q / w; }

float Stepen(float q, float w) { return powf(q, w); }

float COS(float q, float w) { return cos(q); }

float SIN(float q, float w) { return sin(q); }

float TAN(float q, float w) { return tan(q); }

float EXP(float q, float w) { return exp(q); }

float LOG(float q, float w) { return log(q); }

float OTR(float q, float w) { return -q; }

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//vxvod r'eweniya formulx--------------------------------------------------------------------------------------------------------

//eylera----------------------------------------------------------------------

float vdiy(diya *sdiy, int &toqki)

{

for (int i = 0; i < toqki; i++)

*sdiy[i].r = sdiy[i].f(*sdiy[i].q, *sdiy[i].w);

if (toqki) {

// cout << endl << "!!!!! =" << *sdiy[toqki - 1].r;

return *sdiy[toqki - 1].r;

}

else {

// cout << endl << "!!!!! =" << 1;

return 0;

}

}

//rungekuta------------------------------------------------------------------------

int meta = 0;

float rkdiy(diya *sdiy, int &toqki)

{

float k1, k2, k3, k4;

k1 = hk * vdiy(sdiy, toqki); xk += k1 / 2; yk += k1 / 2; zk += k1 / 2;

k2 = hk * vdiy(sdiy, toqki); xk -= k1 / 2 - k2 / 2; yk -= k1 / 2 - k2 / 2; zk -= k1 / 2 - k2 / 2;

k3 = hk * vdiy(sdiy, toqki); xk -= k2 / 2 - k3; yk -= k2 / 2 - k3; zk -= k2 / 2 - k3;

k4 = hk * vdiy(sdiy, toqki); xk -= k3; yk -= k3; zk -= k3;

return hk * (k1 + 2 * k2 + 2 * k3 + k4) / 6;

}
float(*metod)(diya *sdiy, int &toqki) = vdiy;
//vxvod r'eweniya formulx--------------------------------------------------------------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//otrisovka po t---------------------------------------------------------------------------------------------------------------------

void Tpaint() {

glClearColor(1, 1, 1, 0);

glViewport(0, 0, width, height); // Установити область перегляду таку, щоб вона вміщувала все вікно

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);// включаємо режим роботи з видовою матрицею

glLoadIdentity();

glTranslatef(0, 0, distZ);

glRotatef(0, 0, 0, 1);

glLineWidth(2);

glBegin(GL_LINES);
glColor3f(0, 0, 1);

glVertex2f(-distZ, 2.0 / 6 * distZ);

glVertex2f(distZ, 2.0 / 6 * distZ);

glColor3f(1, 0, 0);

glVertex2f(-distZ, -2.0 / 6 * distZ);

glVertex2f(distZ, -2.0 / 6 * distZ);

glColor3f(0, 1, 0);

glVertex2f(-distZ, 0);

glVertex2f(distZ, 0);

glColor3f(0, 0, 0);

glVertex2f(0, -distZ);

glVertex2f(0, distZ);

glEnd();

float *masx = new float[nk];

float *masy = new float[nk];

float *masz = new float[nk];

xk = start.x;// n

yk = start.y;// e

zk = start.z;// m

tk = 0.1;

for (int i = 0; i < nk; i++)

{

tk += 0.1;

//xnk = vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));

//ynk = vdiy(sdiy, tfy);//yk + hk*(rk*xk - yk - zk*xk);

//znk = vdiy(sdiz, tfz);//zk + hk*(-bk*zk + xk*yk);

xnk = metod(sdix, tfx) + xk * meta;

ynk = metod(sdiy, tfy) + yk * meta;

znk = metod(sdiz, tfz) + zk * meta;

xk = xnk;

yk = ynk;

zk = znk;

masx[i] = xnk;

masy[i] = ynk;

masz[i] = znk;

}

glBegin(GL_LINE_STRIP);

tk = 0;

for (int i = 0; i < nk; i++)

{

tk += 0.01;

if (masx[i] - 2.0 / 6 * distZ < -1.0 / 6 * distZ)masx[i] = 1.0 / 6 * distZ;

glVertex2f(tk, masx[i] - 2.0 / 6 * distZ);

}

glEnd();

glBegin(GL_LINE_STRIP);

tk = 0;

for (int i = 0; i < nk; i++)

{

tk += 0.01;

if (masy[i] > -1.0 / 6 * distZ)masy[i] = -1.0 / 6 * distZ;

if (masy[i] < 1.0 / 6 * distZ)masy[i] = 1.0 / 6 * distZ;

glVertex2f(tk, masy[i]);

}

glEnd();

glBegin(GL_LINE_STRIP);

tk = 0;

for (int i = 0; i < nk; i++)

{

tk += 0.01;

if (masz[i] + 2.0 / 6 * distZ > 1.0 / 6 * distZ)masz[i] = -1.0 / 6 * distZ;

glVertex2f(tk, masz[i] + 2.0 / 6 * distZ);

}

glEnd();

glFlush();

glutSwapBuffers();

delete[nk] masx;

delete[nk] masy;

delete[nk] masz;

}

//otrisovka po t---------------------------------------------------------------------------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

//otrisovka---------------------------------------------------------------------------------------------------------------------

void on_paint()

{

// 1 ustanovka naqal'nxh param'etrov-----------------------------------------------------------------------------------------------------------------------------------

angle = 0.0f; // збільшення кута повороту
glViewport(0, 0, width, height); // Установити область перегляду таку, щоб вона вміщувала все вікно

glClearColor(1, 1, 1, 0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очистка буферів OpenGL// задано функцией f(d) = 1.0 / (0.4 * d * d + 0.2 * d)

glMatrixMode(GL_PROJECTION);// включаємо режим роботи з матрицею проекцій

glLoadIdentity();

gluPerspective(60, (GLfloat)width / height, 1, 1000);

glMatrixMode(GL_MODELVIEW);// включаємо режим роботи з видовою матрицею

glLoadIdentity();

glTranslatef(0, 0, distZ); // камера з початку координат зсувається на distZ,

if (rejxmploskosti == 1) {

glRotatef(angleX, 0.0f, 1.0f, 0.0f); // потім повертається по осі Oy

glRotatef(angleY, 1.0f, 0.0f, 0.0f); // потім повертається по осі Ox

}

else if (rejxmploskosti == 2)glRotatef(90, 0.0f, 1.0f, 0.0f);

else if (rejxmploskosti == 3)glRotatef(90, 1.0f, 0.0f, 0.0f);

glEnable(GL_DEPTH_TEST);

glEnable(GL_BLEND);

glEnable(GL_ALPHA_TEST);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

//glPushMatrix();

// 1 ustanovka naqal'nxh param'etrov-----------------------------------------------------------------------------------------------------------------------------------
// 2 osi-----------------------------------------------------------------------------------------------------------------------------------

glColor4f(1, 0, 0, 1);

glLineWidth(2);

glBegin(GL_LINES);

glVertex3f(-1000, 0, 0);

glVertex3f(1000, 0, 0);

glColor4f(0, 1, 0, 1);

glVertex3f(0, -1000, 0);

glVertex3f(0, 1000, 0);

glColor4f(0, 0, 1, 1);

glVertex3f(0, 0, -1000);

glVertex3f(0, 0, 1000);

glEnd();

// 2 osi-----------------------------------------------------------------------------------------------------------------------------------


// 3 grafik-----------------------------------------------------------------------------------------------------------------------------------

xk = start.x;// n

yk = start.y;// e

zk = start.z;// m

tk = 0.1;

//glPointSize(2.5);

glColor4f(1, 0, 0, 1);

glBegin(GL_LINE_STRIP);

for (int i = 0; i < nk - 30; i++)

{

tk += 0.01;

xnk = metod(sdix, tfx) + xk * meta;

ynk = metod(sdiy, tfy) + yk * meta;

znk = metod(sdiz, tfz) + zk * meta;

// xnk=vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));
// ynk=vdiy(sdiy, tfy);//yk + hk*(rk*xk - yk - zk*xk);
// znk=vdiy(sdiz, tfz);//zk + hk*(-bk*zk + xk*yk);

if (flagploskosti == 1)

if (((xnk - point.x)*nmp.x + (ynk - point.y)*nmp.y + (znk - point.z)*nmp.z)*znakploskosti <= 0 && flagproekcxi[3] == 1)

{

float x = (nmp.y*(xk*(ynk - yk) / (xnk - xk) - yk + point.y) + nmp.z*(xk*(znk - zk) / (xnk - xk) - zk + point.z) + nmp.x*point.x) /

(nmp.x + nmp.y*(ynk - yk) / (xnk - xk) + nmp.z*(znk - zk) / (xnk - xk));

znakploskosti *= -1;

glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);

glEnd();

glPointSize(7);

glColor4f(0, 1, 1, 1);

glBegin(GL_POINTS);

glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);

glEnd();

// glPointSize(2.5);

glColor4f(1, 0, 0, 1);

glBegin(GL_LINE_STRIP);

glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);

}

xk = xnk;

yk = ynk;

zk = znk;

glVertex3f(xnk*flagproekcxi[0], ynk*flagproekcxi[1], znk*flagproekcxi[2]);

}

glEnd();
/* glPointSize(10);

glColor3d(0, 1, 0);

glBegin(GL_POINTS);

for (int i = 0; i < 30; i++)

{

tk++;

xnk = vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));

ynk = vdiy(sdiy, tfy);// yk + hk*(rk*xk - yk - zk*xk);

znk = vdiy(sdiz, tfz);// zk + hk*(-bk*zk + xk*yk);

xk = xnk;

yk = ynk;

zk = znk;

glVertex3f(xnk, ynk, znk);

}

glEnd();*/

// 3 grafik-----------------------------------------------------------------------------------------------------------------------------------

// 4 ploskost'-------------------------------------------------------------------------------------

if (flagploskosti)

{

glLineWidth(5);

glColor4f(0, 0, 0, 0.3);
glBegin(GL_POLYGON);

for (int i = 0; i < 4; i++)

{

//cout<

glVertex3f(point.x + uglx[i].x, point.y + uglx[i].y, point.z + uglx[i].z);

}

glEnd();

}

// 4 ploskost'-------------------------------------------------------------------------------------

// 4 finiw-----------------------------------------------------------------------------------------------------------------------------------

glDisable(GL_DEPTH_TEST);

glDisable(GL_ALPHA_TEST);

glDisable(GL_BLEND);

// glPopMatrix();

glFlush();

glutSwapBuffers(); // перемикання буферів

// 4 finiw-----------------------------------------------------------------------------------------------------------------------------------

}

//otrisovka---------------------------------------------------------------------------------------------------------------------

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1   2   3   4


написать администратору сайта