Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include "graphics.h"
- #include <iostream>
- #include <math.h>
- #include <cstdlib>
- #include <string>
- #include <fstream>
- using namespace std;
- double func(double x); // нахождение значения f(x) = tg(x)-(tg(x)^3)/3+(tg(x)^5)/5-1/3
- int main(int argc, char * argv[])
- {
- double *e;
- int *counter;
- int N;
- double a = 0, b = 0.8, x, fb, fa, fx, E;
- int i;
- int w = 1900, h = 1000;
- int height = h - 100;
- int length = w - 50;
- setlocale(LC_ALL, "RUSSIAN");
- cout << "Нахождение корня уравнения tg(x)-(tg(x)^3)/3+(tg(x)^5)/5-1/3=0 методом половинного деления на отрезке [0;0.8]." << endl;
- fa = func(a);
- fb = func(b);
- if (fa * fb >= 0)
- {
- cout << "На заданном отрезке нет корня." << endl;
- }
- else
- {
- cout << "Введите, при скольких различных точностях вы хотите решить данное уравнение (целое число):" << endl << "N = ";
- cin >> N;
- cout << "Введите начальное значение точности (действительное число). Дальнейшие точности будут в 2 раза меньше предыдущей:" << endl << "E = ";
- cin >> E;
- e = new double[N];
- counter = new int[N];
- if (!e || !counter) //Проверка, выделилиась ли память
- {
- cout << "Не удалось выделить память под массивы." << endl;
- return -1;
- }
- for (i = 0; i < N; i++)
- {
- a = 0;
- b = 0.8;
- counter[i] = 0;
- if (i == 0)
- e[i] = E;
- else
- {
- e[i] = e[i - 1] / 2;
- E = e[i];
- }
- while (1)
- {
- x = (b + a) / 2;
- fx = func(x);
- if (fx*fa < 0)
- {
- b = x;
- fb = fx;
- }
- else
- {
- a = x;
- fa = fx;
- }
- counter[i]++;
- if (abs(b - a) <= E)
- {
- x = (b + a) / 2;
- counter[i]++;
- cout << "Ответ: x=" << x << endl << "Количество итераций для точности e=" << e[i] << ": " << counter[i] << endl;
- break;
- }
- }
- }
- cout << "Нажмите Enter, чтобы вывести диаграмму сравнения количества итераций к точности." << endl;
- system("pause");
- int mastx = length / N;
- double maxcounter = counter[0];
- for (i = 1; i < N; i++)
- if (counter[i] > maxcounter)
- maxcounter = counter[i];
- int masty = height / maxcounter;
- char conv[128];
- initwindow(w, h, "Diagrama");
- bar(0, 0, w, h);
- rectangle(0, 0, w, h);
- setcolor(0);
- setbkcolor(15);
- line(30, 30, 30, 30 + height);
- line(30, 30, 25, 40);
- line(30, 30, 35, 40);
- line(30, 30 + height, 20 + length, 30 + height);
- line(20 + length, 30 + height, length + 15, 25 + height);
- line(20 + length, 30 + height, length + 15, 35 + height);
- outtextxy(length + 20, 45 + height, "i");
- outtextxy(length + 20, 60 + height, "e");
- outtextxy(40, 30, "Counter");
- for (i = 0; i < N; i++)
- {
- line(30 + i * mastx, 20 + height, 30 + i * mastx, 40 + height);
- sprintf(conv, "%d", i);
- outtextxy(30 + i * mastx, 45 + height, conv);
- sprintf(conv, "%f", e[i]);
- outtextxy(30 + i * mastx, 60 + height, conv);
- line(20, 30 + height - counter[i] * masty, 40, 30 + height - counter[i] * masty);
- sprintf(conv, "%d", counter[i]);
- outtextxy(5, 30 + height - counter[i] * masty, conv);
- }
- for (i = 0; i < N; i++)
- {
- line(30 + i * mastx, 30 + height, 30 + i * mastx, 30 + height - counter[i] * masty);
- line(30 + i * mastx, 30 + height - counter[i] * masty, 30 + (i + 1) * mastx, 30 + height - counter[i] * masty);
- line(30 + (i + 1) * mastx, 30 + height, 30 + (i + 1) * mastx, 30 + height - counter[i] * masty);
- }
- getch();
- while (!kbhit())
- {
- delay(200);
- }
- getch();
- closegraph();
- cout << "Нажмите Enter, чтобы вывести график сравнения количества итераций к точности." << endl;
- system("pause");
- initwindow(w, h, "Graphics");
- bar(0, 0, w, h);
- rectangle(0, 0, w, h);
- setcolor(0);
- setbkcolor(15);
- line(30, 30, 30, 30 + height);
- line(30, 30, 25, 40);
- line(30, 30, 35, 40);
- line(30, 30 + height, 20 + length, 30 + height);
- line(20 + length, 30 + height, length + 15, 25 + height);
- line(20 + length, 30 + height, length + 15, 35 + height);
- outtextxy(length + 20, 45 + height, "i");
- outtextxy(length + 20, 60 + height, "e");
- outtextxy(40, 30, "Counter");
- for (i = 0; i < N; i++)
- {
- line(30 + i * mastx, 20 + height, 30 + i * mastx, 40 + height);
- sprintf(conv, "%d", i);
- outtextxy(30 + i * mastx, 45 + height, conv);
- sprintf(conv, "%f", e[i]);
- outtextxy(30 + i * mastx, 60 + height, conv);
- line(20, 30 + height - counter[i] * masty, 40, 30 + height - counter[i] * masty);
- sprintf(conv, "%d", counter[i]);
- outtextxy(5, 30 + height - counter[i] * masty, conv);
- }
- for (i = 0; i < N - 1; i++)
- {
- line(30 + i * mastx, 30 + height - counter[i] * masty, 30 + (i + 1) * mastx, 30 + height - counter[i + 1] * masty);
- }
- getch();
- while (!kbhit())
- {
- delay(200);
- }
- getch();
- closegraph();
- delete[] e;
- delete[] counter;
- }
- system("pause");
- return 0;
- }
- double func(double x) // нахождение значения f(x) = tg(x)-(tg(x)^3)/3+(tg(x)^5)/5-1/3
- {
- return (tan(x) - (pow(tan(x), 3) / 3) + (pow(tan(x), 5) / 5) - (1.0 / 3));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement