Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <math.h>
- #include <cmath>
- #include <iostream>
- #include <Windows.h>
- #include <fstream>
- #define centreY 300
- #define centreX 500
- #define maxPow 17
- #define exp 2.7182818284590452353602874713527
- using namespace std;
- HDC hDC = GetDC(GetConsoleWindow());
- HPEN Pen = CreatePen(PS_SOLID, 1, RGB(200, 80, 80));
- HPEN Pen1 = CreatePen(PS_SOLID, 1, RGB(200, 150, 80));
- HPEN Pen2 = CreatePen(PS_SOLID, 1, RGB(200, 200, 80));
- HPEN Pen3 = CreatePen(PS_SOLID, 1, RGB(80, 200, 80));
- HPEN Pen4 = CreatePen(PS_SOLID, 1, RGB(80, 200, 200));
- HPEN Pen5 = CreatePen(PS_SOLID, 1, RGB(80, 80, 200));
- HPEN Pen6 = CreatePen(PS_SOLID, 1, RGB(200, 80, 200));
- HPEN PenCoord = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
- long double a = 0, b = 5;
- long double* y;
- long double* yy;
- long double* x;
- long double* h;
- long double locEps, absEps, rungEps;
- long double coefgor = 100;
- long double coefver = 30;
- long double step;
- long double pz;
- void drawHor(long double x, long double y) {
- MoveToEx(hDC, x + 5, y, NULL);
- LineTo(hDC, x - 5, y);
- }
- void drawVer(long double x, long double y) {
- MoveToEx(hDC, x, y + 5, NULL);
- LineTo(hDC, x, y - 5);
- }
- long double function(long double x) {
- return (sin(x * x) + 3);
- }
- long double functionDer(long double x, long double y) {
- return (2 * x * cos(x * x) + k * (y - function(x)));
- }
- long double maxim(long double first, long double second) {
- if (first >= second) return (first);
- else return second;
- }
- long double countlocEps(long double x, long double y) {
- locEps = abs(abs(function(x)) - abs(y)) / maxim(abs(function(x)), abs(y));
- return locEps;
- }
- long double countabsEps(long double x, long double y) {
- absEps = abs(function(x) - y);
- return absEps;
- }
- long double countRungEps(long double y, long double ycopy) {
- rungEps = ((pow(2, 2)) / (pow(2, 2) - 1)) * (y - ycopy);
- return rungEps;
- }
- long double countExact(long double x, long double nu1, long double nu2, int coord) {
- long double exact;
- if (coord == 0) exact = 0.5 * (nu1 + nu2) * pow(exp, ((-995) * x)) + 0.5 * (nu1 - nu2) * pow(exp, ((-5) * x));
- else exact = 0.5 * (nu1 + nu2) * pow(exp, ((-995) * x)) - 0.5 * (nu1 - nu2) * pow(exp, ((-5) * x));
- return exact;
- }
- void drawOrigin(int n, long double nu) {
- SelectObject(hDC, Pen2);
- step = (b - a) / (n - 1);
- MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * nu, NULL);
- for (int i = 0; i < n; i++) {
- x[i] = a + step * i;
- }
- for (int i = 1; i < n; i++) {
- LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * function(x[i]));
- }
- }
- long double euler(long double* x, long double nu1, long double nu2, int n) {
- SelectObject(hDC, Pen);
- long double maxAbsEps = 0, maxLocEps = 0, maxLocEpsOld = 0;
- long double maxEps = 0, maxOldEps = 0, RungEps = 0;
- long double delta;
- y = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
- yy = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
- y[0] = nu1;
- yy[0] = nu2;
- step = (b - a) / (n - 1);
- for (int j = 0; j < maxPow; j++) {
- if (j != 0) step = step / 2;
- for (int i = 0; i < (n - 1) * pow(2, j) + 1; i++) {
- x[i] = a + step * i;
- }
- MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * countExact(x[0],nu1,nu2,1), NULL);
- for (int i = 1; i < (n - 1) * pow(2, j) + 1; i++) {
- y[i] = (step * (-500) + 1) * y[i - 1] - 495* step * yy[i - 1];
- yy[i] = (-495) * step * y[i - 1] + ((-500) * step + 1) * yy[i - 1];
- LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * countExact(x[i], nu1, nu2, 1));
- /*printf("i= %i", i);
- printf(" locEps= %.15f", countlocEps(x[i], y[i]));
- printf(" absEps=%.15f", countabsEps(x[i], y[i]));*/
- if (maxLocEps < abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)))) maxLocEps = abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)));
- }
- /*printf(" RungEps=%.15f ", RungEps);
- printf("\n");*/
- if (j != 0) {
- pz = (log((maxLocEpsOld) / (maxLocEps))) / log(2);
- printf("pZ=%.15f ", pz);
- }
- printf(" maxLocEps=%.15f", maxLocEps);
- /*if (j != 0) {
- delta = abs(maxOldEps - maxEps);
- printf(" delta=%.15f ", delta);
- printf(" h=%.15f ", step);
- }*/
- maxLocEpsOld = maxLocEps;
- maxOldEps = maxEps;
- maxAbsEps = 0;
- maxLocEps = 0;
- maxEps = 0;
- RungEps = 0;
- printf("\n");
- }
- return (0);
- }
- long double eulerNot(long double* x, long double nu1, long double nu2, int n) {
- SelectObject(hDC, Pen);
- long double maxAbsEps = 0, maxLocEps = 0, maxLocEpsOld = 0;
- long double maxEps = 0, maxOldEps = 0, RungEps = 0;
- long double delta1, delta2, c1, c2, c3, c4;
- y = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
- yy = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
- y[0] = nu1;
- yy[0] = nu2;
- step = (b - a) / (n - 1);
- for (int j = 0; j < maxPow; j++) {
- if (j != 0) step = step / 2;
- for (int i = 0; i < (n - 1) * pow(2, j) + 1; i++) {
- x[i] = a + step * i;
- }
- MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * countExact(x[0], nu1, nu2, 1), NULL);
- delta2 = 1/(4975 * step * step + 1000 * step + 1);
- c3 = 1 + 500 * step;
- c4 = (-495) * step;
- for (int i = 1; i < (n - 1) * pow(2, j) + 1; i++) {
- y[i] = delta2 * (c3 * y[i - 1] + c4 * yy[i - 1]);
- yy[i] = delta2 * (c4 * y[i - 1] + c3 * yy[i - 1]);
- LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * countExact(x[i], nu1, nu2, 1));
- /*printf("i= %i", i);
- printf(" locEps= %.15f", countlocEps(x[i], y[i]));
- printf(" absEps=%.15f", countabsEps(x[i], y[i]));*/
- if (maxLocEps < abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)))) maxLocEps = abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)));
- }
- /*printf(" RungEps=%.15f ", RungEps);
- printf("\n");*/
- if (j != 0) {
- pz = (log((maxLocEpsOld) / (maxLocEps))) / log(2);
- printf("pZ=%.15f ", pz);
- }
- printf(" maxLocEps=%.15f", maxLocEps);
- /*if (j != 0) {
- delta = abs(maxOldEps - maxEps);
- printf(" delta=%.15f ", delta);
- printf(" h=%.15f ", step);
- }*/
- maxLocEpsOld = maxLocEps;
- maxOldEps = maxEps;
- maxAbsEps = 0;
- maxLocEps = 0;
- maxEps = 0;
- RungEps = 0;
- printf("\n");
- }
- return (0);
- }
- long double gear(long double* x, long double nu1, long double nu2, int n) {
- SelectObject(hDC, Pen);
- long double maxAbsEps = 0, maxLocEps = 0, maxLocEpsOld = 0, maxLoc1Eps = 0, maxLoc2Eps = 0;
- long double maxEps = 0, maxOldEps = 0, RungEps = 0;
- long double delta1,delta2,c1,c2,c3,c4;
- y = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
- yy = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
- y[0] = nu1;
- yy[0] = nu2;
- step = (b - a) / (n - 1);
- for (int j = 0; j < maxPow; j++) {
- if (j != 0) step = step / 2;
- for (int i = 0; i < (n - 1) * pow(2, j) + 1; i++) {
- x[i] = a + step * i;
- }
- MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * y[0], NULL);
- delta1 = 1/(716400 * step * step + 300000 * step + 625);
- delta2 = 1/(4975 * step * step + 1000 * step + 1);
- c1 = 25 + 12 * 500 * step;
- c2 = (-12) * 495 * step;
- c3 = 1 + 500 * step;
- c4= (-495) * step;
- for (int i = 1; i < (n - 1) * pow(2, j) + 1; i++) {
- if (i <= 3) {
- y[i] = delta2*(c3*y[i-1]+c4*yy[i-1]);
- yy[i] = delta2*(c4* y[i - 1] + c3 * yy[i - 1]);
- }
- else if (i > 3) {
- y[i] = delta1*(48*(c1*y[i-1]+c2*yy[i-1])-36*(c1 * y[i - 2] + c2 * yy[i - 2])+16* (c1 * y[i - 3] + c2 * yy[i - 3])-3*(c1 * y[i - 4] + c2 * yy[i - 4]));
- yy[i] = delta1 * (48 * (c2 * y[i - 1] + c1 * yy[i - 1]) - 36 * (c2 * y[i - 2] + c1 * yy[i - 2]) + 16 * (c2* y[i - 3] + c1 * yy[i - 3]) - 3 * (c2 * y[i - 4] + c1 * yy[i - 4]));
- }
- LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * y[i]);
- /*printf("i= %i", i);
- printf(" locEps= %.15f", countlocEps(x[i], y[i]));
- printf(" absEps=%.15f", countabsEps(x[i], y[i]));*/
- if (maxLocEps < abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)))) maxLocEps = abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)));
- if (maxLoc1Eps < abs(delta1 * (48 * (c1 * y[i - 1]) - 36 * (c1 * y[i - 2] ) + 16 * (c1 * y[i - 3] ) - 3 * (c1 * y[i - 4] )))) maxLoc1Eps = abs(delta1 * (48 * (c1 * y[i - 1]) - 36 * (c1 * y[i - 2]) + 16 * (c1 * y[i - 3]) - 3 * (c1 * y[i - 4])));
- if (maxLoc2Eps < abs(delta1 * (48 * (c2 * yy[i - 1]) - 36 * ( c2 * yy[i - 2]) + 16 * (c2 * yy[i - 3]) - 3 * (c2 * yy[i - 4])))) maxLoc2Eps = abs(delta1 * (48 * (c2 * yy[i - 1]) - 36 * (c2 * yy[i - 2]) + 16 * (c2 * yy[i - 3]) - 3 * (c2 * yy[i - 4])));
- }
- /*printf(" RungEps=%.15f ", RungEps);
- printf("\n");*/
- if (j != 0) {
- pz = (log((maxLocEpsOld) / (maxLocEps))) / log(2);
- printf("pZ=%.15f ", pz);
- }
- //printf(" maxLocEps=%.15f", maxLocEps);
- printf(" maxLoc1Eps=%.15f", maxLoc1Eps);
- printf(" maxLoc2Eps=%.15f", maxLoc2Eps);
- /*if (j != 0) {
- delta = abs(maxOldEps - maxEps);
- printf(" delta=%.15f ", delta);
- printf(" h=%.15f ", step);
- }*/
- maxLocEpsOld = maxLocEps;
- maxOldEps = maxEps;
- maxAbsEps = 0;
- maxLocEps = 0;
- maxLoc1Eps = 0;
- maxLoc2Eps = 0;
- maxEps = 0;
- RungEps = 0;
- printf("\n");
- }
- return (0);
- }
- void Coord()
- {
- SelectObject(hDC, PenCoord);
- MoveToEx(hDC, centreX - coefgor * 50, centreY, NULL);
- LineTo(hDC, centreX + coefgor * 100, centreY);
- MoveToEx(hDC, centreX, centreY - coefver * 50, NULL);
- LineTo(hDC, centreX, centreY + coefver * 1000);
- SetBkMode(hDC, TRANSPARENT);
- SetTextColor(hDC, RGB(255, 255, 255));
- //TextOut(hDC, centreX - 4, centreY + 2, textright, ARRAYSIZE(textright));
- MoveToEx(hDC, centreX, centreY, NULL);
- for (int t = 0; t < 20; t++) {
- drawVer(centreX + coefgor * (t), centreY);
- {if (t == 0) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "0", 1);
- if (t == 1) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "1", 1);
- if (t == 2) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "2", 1);
- if (t == 3) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "3", 1);
- if (t == 4) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "4", 1);
- if (t == 5) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "5", 1);
- if (t == 6) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "6", 1);
- if (t == 7) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "7", 1);
- if (t == 8) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "8", 1);
- if (t == 9) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "9", 1);
- if (t == 10) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "10", 2); }
- }
- MoveToEx(hDC, centreX, centreY, NULL);
- for (int t = 0; t < 10; t++) {
- drawHor(centreX, centreY + coefver * (t));
- }
- MoveToEx(hDC, centreX, centreY, NULL);
- for (int l = 0; l < 20; l++) {
- drawVer(centreX - coefgor * (l), centreY);
- }
- MoveToEx(hDC, centreX, centreY, NULL);
- for (int t = 0; t < 10; t++) {
- drawHor(centreX, centreY - coefver * (t));
- {if (t == 1) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "1", 1);
- if (t == 2) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "2", 1);
- if (t == 3) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "3", 1);
- if (t == 4) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "4", 1);
- if (t == 5) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "5", 1);
- if (t == 6) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "6", 1);
- if (t == 7) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "7", 1);
- if (t == 8) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "8", 1);
- if (t == 9) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "9", 1);
- if (t == 10) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "10", 2); }
- }
- }
- void main() {
- int n;
- printf("N: ");
- scanf_s("%i", &n);
- long double nu1 = 0;
- long double nu2 = 1;
- x = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
- Coord();
- //euler(x, nu1, nu2, n);
- //eulerNot(x, nu1, nu2, n);
- gear(x, nu1,nu2, n);
- //drawOrigin(50, nu);
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement