Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Lst3Tasks.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <math.h>
- #include <Windows.h>
- using namespace std;
- double f(double x)
- {
- return (3 * cos(x)*x);
- }
- void doubleDots(double left, double right)
- {
- double eps = 0.07f;
- double a = left; double b = right;
- double x1, x2;
- int count = 0;
- x1 = (a + b - eps) / 2;
- x2 = (a + b + eps) / 2;
- while (count < 10)
- {
- count++;
- if (f(x1) < f(x2))
- {
- b = x2;
- x1 = (a + b - eps) / 2;
- x2 = (a + b + eps) / 2;
- }
- else
- {
- a = x1;
- x1 = (a + b - eps) / 2;
- x2 = (a + b + eps) / 2;
- }
- }
- cout << "xmin = " << (a + b) / 2 << "\nf(xmin) = " << f((a + b) / 2) << "\n";
- }
- void fibonaci(double left, double right)
- {
- int arr[13] = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 };
- double a, b, eps, x1, x2;
- eps = 0.01f; a = left; b = right;
- x1 = ((b - a) * 233 - eps) / 377 + a;
- x2 = a - x1 + b;
- int i = 12; int j = 11;
- while (i)
- {
- if (f(x2) > f(x1))
- {
- if (x2 > x1)
- {
- b = x2;
- x1 = ((b - a) * arr[j] - eps) / arr[i] + a;
- x2 = a - x1 + b;
- }
- else
- {
- a = x2;
- x1 = ((b - a) * arr[j] - eps) / arr[i] + a;
- x2 = a - x1 + b;
- }
- }
- else
- {
- if (x1 > x2)
- {
- b = x1;
- x1 = x2;
- x2 = a - x1 + b;
- }
- else
- {
- a = x1;
- x1 = x2;
- x1 = ((b - a) * arr[j] - eps) / arr[i] + a;
- }
- }
- i--; j--;
- }
- if (!i)
- {
- cout << "xmin = " << (a + b) / 2 << "\nf(xmin) = " << f((a + b) / 2) << "\n";
- return;
- }
- }
- void kvInterpol(double left, double right)
- {
- double a;
- a = (right - left) / 2 + (right - left) / 6.5f + left;
- double x1, x2, x3, y1, y2, y3;
- double h = 0.0005; double eps = 0.07; double xmin;
- x1 = a - h;
- x2 = a;
- x3 = a + h;
- y1 = f(x1);
- y2 = f(x2);
- y3 = f(x3);
- xmin = 0.5f * ((x2 * x2 - x3 * x3) * f(x1) + (x3 * x3 - x1 * x1) * f(x2) + (x1 * x1 - x2 * x2) * f(x3)) /
- ((x2 - x3) * f(x1) + (x3 - x1) * f(x2) + (x1 - x2) * f(x3));
- while (abs(f(a) - f(xmin)) >= eps)
- {
- a = xmin;
- x1 = a - h;
- x2 = a;
- x3 = a + h;
- y1 = f(x1);
- y2 = f(x2);
- y3 = f(x3);
- xmin = 0.5f * ((x2 * x2 - x3 * x3) * f(x1) + (x3 * x3 - x1 * x1) * f(x2) + (x1 * x1 - x2 * x2) * f(x3)) /
- ((x2 - x3) * f(x1) + (x3 - x1) * f(x2) + (x1 - x2) * f(x3));
- }
- cout << "xmin = " << xmin << "\nf(xmin) = " << f(xmin) << "\n";
- }
- int main()
- {
- double left, right;
- cout << "f(x) = 3*cos(x)*x\n";
- cout << "Input the left edge\n"; cin >> left;
- cout << "\nInput the right edge\n"; cin >> right;
- if (left > right)
- {
- double *buf = new double;
- *buf = left;
- left = right;
- right = *buf;
- delete buf;
- }
- doubleDots(left, right);
- fibonaci(left, right);
- kvInterpol(left, right);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment