Курсовая Использование аттракторов. Использование аттракторов
Скачать 367.67 Kb.
|
Аттрактор УэдыОдин из первых примеров хаоса в электрических цепях был открыт Уэдой в цепи с нелинейным индуктивным элементом. Цепь с нелинейной индуктивностью и линейным сопротивлением, возбуждаемая гармонической электродвижущей силой, описывается уравнением ) которое является частным случаем уравнения Дуффинга. С помощью аналогового и численного моделирования Уэда, сотрудник университета Киото в Японии, получил интересную визуализацию отображений Пуанкаре, описывающую хаотическую динамику этого уравнения. Уравнения этой модели, записанные в виде системы уравнений первого порядка, имеют вид Алгоритм и программаДля разработки программы был выбран язык программирования 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--------------------------------------------------------------------------------------------------------------------- //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |