求导算子
题目描述
众所周知,导函数可以用求导算子 给出。求导算子将函数 映射到函数 ;其定义为 。
下面你将在 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;
}
}