以下代码允许您使用切线法求解方程:
#include <iostream>
double q_func(double x, double k, double y)
{
return x * pow(1 - (k-1)/(k+1) * x * x, 1/(k-1)) * pow((k+1)/2, 1/(k-1)) - y;
}
double solve(double (*f)(double, double, double), double k, double y, double x_0=2.3, int n=50)
{
double x = x_0;
double dx = 1e-5;
double df = (f(x+dx, k, y)-f(x, k, y))/dx;
for (int i=0; i<=n;i++){
x_0 = x;
x -= f(x, k, y) / df;
if (abs(x - x_0) < 1e-6)
return x;
}
return x;
}
int main() {
double x = solve(q_func, 1.4, 0.25);
std::cout << x << std::endl;
return 0;
}
该函数q_func
有 3 个参数,现在,为了求解方程 (find x
),我将solve
两个额外的参数k
和传递给函数y
。
事实证明,在为函数添加参数时,q_func
我需要额外重写solve
. 在这种情况下,具有两个参数的方程无法再求解,需要保存旧签名,导致代码重复。有什么办法可以避免这种情况吗?
主要是想到传递vector
或map
第二个参数,但也许有更多的 C++ 路径解决方案?