Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <functional>
- #include <cmath>
- double delta = 0.000001;
- double f1(double x) {
- return exp(x) + 2;
- }
- double f2(double x) {
- return -(5 / x);
- }
- double f3(double x) {
- return -2 * x + 8;
- }
- double f1d1(double x) {
- return exp(x);
- }
- double f2d1(double x) {
- return 5 / (x * x);
- }
- double f3d1(double x) {
- return -2;
- }
- double f1d2(double x) {
- return exp(x);
- }
- double f2d2(double x) {
- return -10 / (x * x * x);
- }
- double f3d2(double x) {
- return 0;
- }
- double f1mf2(double x) {
- return f1(x) - f2(x);
- }
- double f2mf3(double x) {
- return f2(x) - f3(x);
- }
- double f1mf3(double x) {
- return f1(x) - f3(x);
- }
- double f1d1mf2d1(double x) {
- return f1d1(x) - f2d1(x);
- }
- double f2d1mf3d1(double x) {
- return f2d1(x) - f3d1(x);
- }
- double f1d1mf3d1(double x) {
- return f1d1(x) - f3d1(x);
- }
- double f1d2mf2d2(double x) {
- return f1d2(x) - f2d2(x);
- }
- double f2d2mf3d2(double x) {
- return f2d2(x) - f3d2(x);
- }
- double f1d2mf3d2(double x) {
- return f1d2(x) - f3d2(x);
- }
- double Root(double a, double b, std::function<double(double)> f, std::function<double(double)> d1, std::function<double(double)> d2) {
- bool to_right = d1((a + b) / 2) * d2((a + b) / 2) > 0;
- for (;;) {
- double c = (std::abs(f(b)) * a + std::abs(f(a)) * b) / (std::abs(f(b)) + std::abs(f(a)));
- double d;
- if (to_right) {
- d = (std::fabs(d1(b)) * b - std::fabs(f(b))) / std::fabs(d1(b));
- }
- else {
- d = (std::fabs(d1(a)) * a + std::fabs(f(a))) / std::fabs(d1(a));
- }
- if (to_right) {
- if (f(c) * f(c + delta) < 0) return c;
- if (f(d) * f(d - delta) < 0) return d;
- }
- else {
- if (f(c) * f(c - delta) < 0) return c;
- if (f(d) * f(d + delta) < 0) return d;
- }
- if (to_right) {
- a = c;
- b = d;
- }
- else {
- b = c;
- a = d;
- }
- }
- }
- double Area(double a, double b, std::function<double(double)> f) {
- double ans = 0;
- for (double i = a; i < b; i += delta) {
- ans += delta * f(i);
- }
- return ans;
- }
- double FinalArea(std::function<double(double)> f1, std::function<double(double)> f2, std::function<double(double)> f3,
- std::function<double(double)> f1d1, std::function<double(double)> f2d1, std::function<double(double)> f3d1,
- std::function<double(double)> f1d2, std::function<double(double)> f2d2, std::function<double(double)> f3d2,
- std::function<double(double)> f1d1mf2d1, std::function<double(double)> f2d1mf3d1, std::function<double(double)> f1d1mf3d1,
- std::function<double(double)> f1mf2, std::function<double(double)> f2mf3, std::function<double(double)> f1mf3,
- std::function<double(double)> f1d2mf2d2, std::function<double(double)> f2d2mf3d2, std::function<double(double)> f1d2mf3d2) {
- double a = Root(-2, -0.1, f2mf3, f2d1mf3d1, f2d2mf3d2);
- double b = Root(-4, -2, f1mf2, f1d1mf2d1, f1d2mf2d2);
- double c = Root(0, 2, f1mf3, f1d1mf3d1, f1d2mf3d2);
- return Area(b, a, f2) - Area(b, a, f1) + (Area(a, c, f3) - Area(a, c, f1));
- }
- int main() {
- std::cout << FinalArea(f1, f2, f3, f1d1, f2d1, f3d1, f1d2, f2d2, f3d2, f1d1mf2d1, f2d1mf3d1, f1d1mf3d1, f1mf2, f2mf3, f1mf3, f1d2mf2d2, f2d2mf3d2, f1d2mf3d2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement