Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <utility>
- #include <math.h>
- using namespace std;
- typedef pair<double, double> pdd;
- const double dx = 0.0001;
- double f(double x) {
- return log(cos(x)) + cos(x);
- }
- void print(pdd p) {
- cout << p.first << " " << p.second << endl;
- }
- pdd SvenMax(double x0, double h) {
- double f1 = f(x0);
- double f2 = f(x0 + h);
- double f0 = f(x0 - h);
- int k = 1;
- double x1, x2;
- if (f0 >= f1 && f1 >= f2) {
- x1 = x0 - h;
- h = -h;
- }
- else if (f0 <= f1 && f1 <= f2) {
- x1 = x0 + h;
- }
- else {
- return pdd(x0 - h, x0 + h);
- }
- x2 = x1;
- x1 = x0;
- do {
- x0 = x1;
- x1 = x2;
- x2 = x1 + pow(2, 1.0 * k) * h;
- k++;
- } while (f(x2) >= f(x1));
- if (h > 0) {
- return pdd(x0, x2);
- }
- else {
- return pdd(x2, x0);
- }
- }
- double PD(pdd t, double e) {
- double a = t.first;
- double b = t.second;
- double x1, x2;
- double xc = (a + b) / 2;
- double l = b - a;
- while (l > e) {
- x1 = a + l / 4;
- x2 = b - l / 4;
- if (f(x1) > f(xc)) {
- b = xc;
- xc = x1;
- }
- else if (f(x2) > f(xc)) {
- a = xc;
- xc = x2;
- }
- else {
- a = x1;
- b = x2;
- }
- l = b - a;
- }
- return xc;
- }
- int main(void) {
- pdd a = SvenMax(-1, 1);
- cout << "cut: ";
- print(a);
- double b = PD(a, 0.00001);
- cout << "max: ";
- cout << "(" << b << ";" << f(b) << ")" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement