Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cmath>
- #include<ctime>
- #include<iomanip>
- using namespace std;
- double myfunc(double t);
- double myfunc1(double t);
- double myfunc2(double t);
- void coutPromFirst(int n, double c, double a, double b);
- void coutPromSecond(int n, double x, char c);
- void coutPromThird(int n, double x, double xLast, double sigma, char c);
- void coutPromSecond(int n, double x, char c);
- void coutPromFourth(int n, double x, double xLast, double gamma, char c);
- int sign(double t);
- double min(double first, double second);
- double max(double first, double second);
- void HalfDis();
- void SimpleIteration();
- void Newton();
- void ModifyNewton();
- void Chords();
- double TransFunc(double t);
- double TransFunc1(double t);
- double TransFunc2(double t);
- void TransModifyNewton(double a, double b);
- void TransNewton(double a, double b);
- void main()
- {
- setlocale(LC_ALL, "rus");
- HalfDis();
- SimpleIteration();
- Newton();
- ModifyNewton();
- Chords();
- cout << "========================================================================"<<endl;
- TransModifyNewton(19,20);
- TransModifyNewton(18, 18.5);
- TransModifyNewton(0.1, 0.2);
- TransModifyNewton(-0.01, 0.1);
- TransModifyNewton(-15, -15.3);
- TransNewton(-16.2, -16.5);
- TransModifyNewton(-21, -21.1);
- TransNewton(-22.5, -23);
- system("pause");
- }
- void HalfDis()
- {
- double a = -1;
- double b = 0;
- double c, eps = 0.00001;
- cout << "1) Метод половинного деления." << endl;
- int iterator = 0;
- while (fabs(b - a) >= eps)
- {
- c = (a + b) / 2.;
- coutPromFirst(iterator, c, a, b);
- if (myfunc(a)*myfunc(c) < 0)
- b = c;
- else
- a = c;
- iterator++;
- }
- cout << "Уточненный корень уравнения: x=" << setprecision(5) << fixed << c << endl;
- cout << "Итераций: " << iterator << endl;
- }
- void SimpleIteration()
- {
- double a = -1.;
- double b = 0.;
- double eps = 0.00001;
- double x, xLast, alpha, m1, M1;
- cout << "2)Метод простой итерации." << endl;
- x = xLast = 2;
- if (sign(myfunc2(a)) == sign(myfunc2(b)))
- {
- M1 = fabs(myfunc1(max(a, b)));
- m1 = fabs(myfunc1(min(a, b)));
- }
- else
- {
- M1 = m1 = fabs(myfunc1(a));
- for (double count = a; count <= b; count += 0.05)
- {
- if (fabs(myfunc1(count)) > M1)
- M1 = fabs(myfunc1(count));
- if (fabs(myfunc1(count)) < m1)
- m1 = fabs(myfunc1(count));
- }
- }
- alpha = 2. / (m1 + M1);
- if (!(myfunc1(a) > 0 && myfunc1(b) > 0))
- alpha *= (-1);
- int n;
- for (n = 0; fabs(myfunc(x)) / m1 >= eps; n++)
- {
- coutPromSecond(n, x, '-');
- xLast = x;
- x = xLast - alpha*myfunc(xLast);
- }
- coutPromSecond(n, x, '+');
- cout << "Уточненный корень уравнения: x=" << setprecision(5) << fixed << x << endl;
- cout << "Итераций:" << n << endl;
- }
- void Newton()
- {
- double a = -1.;
- double b = 0.;
- double eps = 0.00001, x0, x1;
- cout << "3) Метод касательных." << endl;
- int iterator = 0;
- x0 = a;
- x1 = x0 - myfunc(x0) / myfunc1(x0);
- while (fabs(x1 - x0) > eps)
- {
- coutPromThird(iterator, x1, x0, eps, '-');
- x0 = x1;
- x1 = x0 - myfunc(x0) / myfunc1(x0);
- iterator++;
- }
- coutPromThird(iterator++, x1, x0, eps, '+');
- cout << "Уточненный корень уравнения: x=" << setprecision(5) << fixed << x1 << endl;
- cout << "Итераций:" << iterator << endl;
- }
- void ModifyNewton()
- {
- double a = -1.;
- double b = 0.;
- double eps = 0.00001, x0;
- double x, xLast, m1;
- int n = 0;
- cout << "3.1) Модифицированный метод касательных." << endl;
- xLast = 0;
- m1 = min(fabs(myfunc1(a)), fabs(myfunc1(b)));
- for (x = a; myfunc(x)*myfunc2(x) <= 0; x += 0.05);
- x0 = x;
- for (n = 0; (fabs(myfunc(x)) / m1) >= eps; n++)
- {
- coutPromSecond(n, x, '-');
- xLast = x;
- x = xLast - (myfunc(xLast) / myfunc1(x0));
- }
- coutPromSecond(n++, x, '+');
- cout << "Уточненный корень уравнения: x=" << setprecision(6) << fixed << x << endl;
- cout << "Итераций:" << n << endl;
- }
- void Chords()
- {
- double a = -1;
- double b = 0.;
- double eps = 0.00001;
- double x, xLast, M1, m1, gamma;
- int n = 0;
- cout << "4) Метод хорд." << endl;
- M1 = fabs(myfunc1(max(a, b)));
- m1 = fabs(myfunc1(min(a, b)));
- gamma = (m1 * eps) / (M1 - m1);
- if (myfunc(a)*myfunc2(a) < 0)
- for (xLast = 1, x = a; fabs(x - xLast) >= fabs(gamma);n++)
- {
- coutPromFourth(n, x, xLast, gamma, '-');
- xLast = x;
- x = xLast - (myfunc(xLast) / (myfunc(b) - myfunc(xLast))*(b - xLast));
- }
- else
- for (xLast = 1, x = b; fabs(x - xLast) >= fabs(gamma);n++)
- {
- coutPromFourth(n, x, xLast, gamma, '-');
- xLast = x;
- x = xLast - (myfunc(xLast) / (myfunc(a) - myfunc(xLast))*(a - xLast));
- }
- coutPromFourth(n++, x, xLast, gamma, '+');
- cout << "Уточненный корень уравнения: x=" << setprecision(6) << fixed << x << endl;
- cout << "Итераций:" << n << endl;
- }
- double myfunc(double t)
- {
- double res;
- res = t*t*t - t*t + 2 * t + 3;
- return res;
- }
- double myfunc1(double t)
- {
- double res;
- res = 3*t*t - 2*t + 2;
- return res;
- }
- double myfunc2(double t)
- {
- double res;
- res = 6 * t - 2;
- return res;
- }
- int sign(double t)
- {
- if (t > 0)
- return 1;
- else
- if (t < 0)
- return -1;
- return 0;
- }
- double min(double first, double second)
- {
- if (first < second)
- return first;
- return second;
- }
- double max(double first, double second)
- {
- if (first > second)
- return first;
- return second;
- }
- void coutPromFirst(int n, double c, double a, double b)
- {
- if (n == 0)
- cout << setw(5) << "n" << setw(10) << "a" << setw(10) << "x" << setw(10) << "b" << setw(15) << "f(a)" << setw(15) << "f(x)" << setw(12) << "f(b)" << endl << endl;
- cout << setw(5) << n + 1 << setw(10) << a << setw(10) << c << setw(10) << b << setw(15) << myfunc(a) << setw(15) << myfunc(c) << setw(12) << myfunc(b) << endl;
- }
- void coutPromSecond(int n, double x, char c)
- {
- double eps = 0.00001;
- if (n == 0)
- cout << setw(5) << "n" << setw(10) << "x" << setw(15) << "|f(x)|/m_1" << setw(25) << "|f(x)|/m_1 < " << eps << endl << endl;
- cout << setw(5) << n + 1 << setw(10) << x << setw(15) << fabs(myfunc(x)) / 6 << setw(25) << c << endl;
- }
- void coutPromThird(int n, double x, double xLast, double sigma, char c)
- {
- if (n == 0)
- cout << setw(5) << "n" << setw(12) << "x_n" << setw(20) << "|x_n - x_(n-1)|" << setw(20) << "|x_n - x_(n-1)| < " << sigma << endl << endl;
- cout << setw(5) << n + 1 << setw(7) << x << setw(14);
- if (n == 0)
- cout << "---";
- else
- cout << fabs(x - xLast);
- cout << setw(25) << c << endl;
- }
- void coutPromFourth(int n, double x, double xLast, double gamma, char c)
- {
- cout.precision(8);
- coutPromThird(n, x, xLast, gamma, c);
- cout.precision(6);
- }
- double TransFunc(double t)
- {
- return(pow((t - 1), 3)*cos(t) + 1 - 14 * pow(t, 2));
- }
- double TransFunc1(double t)
- {
- return(-28 * t - pow((t - 1), 3)*sin(t) + 3 * pow((t - 1), 2)*cos(t));
- }
- double TransFunc2(double t)
- {
- return(-pow((t - 1), 3)*cos(t) - 6 * pow((t - 1), 2)*sin(t) + 6 * (t - 1)*cos(t) - 28);
- }
- void TransModifyNewton(double a, double b)
- {
- //double a;
- //double b;
- double eps = 0.00001, x0;
- double x, xLast, m1;
- int n = 0;
- cout << "3.1) Модифицированный метод касательных." << endl;
- /*cout << "Введите начало и конец отрезка:" << endl;
- cout << "a="; cin >> a;
- cout << "b="; cin >> b;*/
- xLast = 0;
- m1 = min(fabs(TransFunc1(a)), fabs(TransFunc1(b)));
- for (x = a; TransFunc(x)*TransFunc2(x) <= 0; x += 0.05);
- x0 = x;
- for (n = 0; (fabs(TransFunc(x)) / m1) >= eps; n++)
- {
- coutPromSecond(n, x, '-');
- xLast = x;
- x = xLast - (TransFunc(xLast) / TransFunc1(x0));
- }
- coutPromSecond(n++, x, '+');
- cout << "Уточненный корень уравнения: x=" << setprecision(5) << fixed << x << endl;
- cout << "Итераций:" << n << endl;
- }
- void TransNewton(double a, double b)
- {
- double eps = 0.00001, x0, x1;
- cout << "3) Метод касательных." << endl;
- int iterator = 0;
- x0 = a;
- x1 = x0 - TransFunc(x0) / TransFunc1(x0);
- while (fabs(x1 - x0) > eps)
- {
- coutPromThird(iterator, x1, x0, eps, '-');
- x0 = x1;
- x1 = x0 - TransFunc(x0) / TransFunc1(x0);
- iterator++;
- }
- coutPromThird(iterator++, x1, x0, eps, '+');
- cout << "Уточненный корень уравнения: x=" << setprecision(5) << fixed << x1 << endl;
- cout << "Итераций:" << iterator << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement