求导算子

题目描述

众所周知,导函数可以用求导算子 给出。求导算子将函数 映射到函数 ;其定义为

下面你将在 C++ 中模拟求导算子。我们假定函数 总是连续可微的。对于极限过程,直接近似地将无穷小 定义为

关于输入

若干行,第 i 行为浮点数 xi

关于输出

对于每一行输入,输出两个空格分隔的浮点数 2*xi 、 cos(xi),以换行结尾。

输出时保留小数点后两位数字。

参考答案

#include <iostream>
#include <iomanip>
#include <cmath>

constexpr double DX = 1e-6;

template <typename F>
auto d(F f) {
    return [=] (double x) {
        return (f(x + DX) - f(x)) / DX;
    };
}

int main() {
    auto f = [&] (double x) { return x * x; };
    auto g = [=] (double x) { return std::sin(x); };

    double x;
    std::cout << std::fixed << std::setprecision(2);
    while (std::cin >> x) {
        std::cout << d(f)(x) << ' ';
        std::cout << d(g)(x) << std::endl;
    }
}





 
 
 
 
 
 
 
 











#include <iostream>
#include <iomanip>
#include <cmath>

constexpr double DX = 1e-6;

template <typename F>
class Derivation {
    F func;

public:
    Derivation(F func) : func(func) {}
    double operator()(double x) {
        return (func(x + DX) - func(x)) / DX;
    }
};

template <typename F>
Derivation<F> d(F func) {
    return Derivation<F>(func);
}

int main() {
    auto f = [&] (double x) { return x * x; };
    auto g = [=] (double x) { return std::sin(x); };

    double x;
    std::cout << std::fixed << std::setprecision(2);
    while (std::cin >> x) {
        std::cout << d(f)(x) << ' ';
        std::cout << d(g)(x) << std::endl;
    }
}