如何在 boost C++ 中对具有多个参数的函数使用二分法
How to use the bisection method in boost C++ for a function with multiple arguments
我在 C++
中有以下功能
#include <cmath>
#include <utility>
#include <iostream>
#include <boost/math/tools/roots.hpp>
double my_fn(double x, double y)
{
return x*x - y - 1;
};
int main() {
double min_x = 0.0; // min value of domain of x
double max_x = 10.0; // max value of domain of x
double y = 1;
// how to use boost's bisection to find solution of my_fn for y = 1
return (0);
}
如您所见,my_fn
有两个参数 x
和 y
。但是我想在给定 y = 1
.
的情况下找到此函数的解决方案
能否请您使用bisection
方法帮助找到解决方案?
您可以使用 lambda(很有可能编译器会内联所有内容),如下所示:
#include <boost/math/tools/roots.hpp>
#include <iostream>
double my_fn(double x, double y) { return x * x - y - 1; };
int main()
{
double min_x = 0.0; // min value of domain of x
double max_x = 10.0; // max value of domain of x
double y = 1;
std::pair<double, double> result =
boost::math::tools::bisect([y](double x) { return my_fn(x, y); },
min_x,
max_x,
boost::math::tools::eps_tolerance<double>());
std::cout << "Result " << result.first << ", " << result.second;
return 0;
}
打印:
Result 1.41421, 1.41421
您可以在此处阅读有关 lambda 和 lambda 捕获的信息:cpp.reference lambda section。
#include <cmath>
#include <utility>
#include <iostream>
#include <boost/math/tools/roots.hpp>
double my_fn(double x, double y)
{
return x*x - y - 1;
};
int main() {
double min_x = 0.0; // min value of domain of x
double max_x = 10.0; // max value of domain of x
double y = 1;
auto x = boost::math::tools::bisect(
[y](double x){ return my_fn(x,y); },
min_x,
max_x,
[](double x,double y){return abs(x-y) < 0.01;}
);
std::cout << "The minimum is between x=" << x.first << " and x=" << x.second;
// how to use boost's bisection to find solution of my_fn for y = 1
return (0);
}
bisect
是模板。第一个参数是可调用的(最小化函数),然后是初始括号(最小值和最大值),最后一个参数是评估停止条件的可调用的。
或者你可以写一个函数:
double my_fn_y1(double x) {
return my_fn(x,1);
}
并将其最小化。
PS:该函数不是return解,而是使停止条件为真的最终区间。真正的解决方案是在那个区间的某个地方。
我在 C++
#include <cmath>
#include <utility>
#include <iostream>
#include <boost/math/tools/roots.hpp>
double my_fn(double x, double y)
{
return x*x - y - 1;
};
int main() {
double min_x = 0.0; // min value of domain of x
double max_x = 10.0; // max value of domain of x
double y = 1;
// how to use boost's bisection to find solution of my_fn for y = 1
return (0);
}
如您所见,my_fn
有两个参数 x
和 y
。但是我想在给定 y = 1
.
能否请您使用bisection
方法帮助找到解决方案?
您可以使用 lambda(很有可能编译器会内联所有内容),如下所示:
#include <boost/math/tools/roots.hpp>
#include <iostream>
double my_fn(double x, double y) { return x * x - y - 1; };
int main()
{
double min_x = 0.0; // min value of domain of x
double max_x = 10.0; // max value of domain of x
double y = 1;
std::pair<double, double> result =
boost::math::tools::bisect([y](double x) { return my_fn(x, y); },
min_x,
max_x,
boost::math::tools::eps_tolerance<double>());
std::cout << "Result " << result.first << ", " << result.second;
return 0;
}
打印:
Result 1.41421, 1.41421
您可以在此处阅读有关 lambda 和 lambda 捕获的信息:cpp.reference lambda section。
#include <cmath>
#include <utility>
#include <iostream>
#include <boost/math/tools/roots.hpp>
double my_fn(double x, double y)
{
return x*x - y - 1;
};
int main() {
double min_x = 0.0; // min value of domain of x
double max_x = 10.0; // max value of domain of x
double y = 1;
auto x = boost::math::tools::bisect(
[y](double x){ return my_fn(x,y); },
min_x,
max_x,
[](double x,double y){return abs(x-y) < 0.01;}
);
std::cout << "The minimum is between x=" << x.first << " and x=" << x.second;
// how to use boost's bisection to find solution of my_fn for y = 1
return (0);
}
bisect
是模板。第一个参数是可调用的(最小化函数),然后是初始括号(最小值和最大值),最后一个参数是评估停止条件的可调用的。
或者你可以写一个函数:
double my_fn_y1(double x) {
return my_fn(x,1);
}
并将其最小化。
PS:该函数不是return解,而是使停止条件为真的最终区间。真正的解决方案是在那个区间的某个地方。