微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Boost C ++中对具有多个参数的函数使用二等分方法

如何解决如何在Boost C ++中对具有多个参数的函数使用二等分方法

我在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接受两个参数xy。但是我想找到给定y = 1的此函数解决方案。

请帮助您使用bisection方法找到解决方案?

解决方法

#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:该函数不会返回 解决方案,而是返回使停止条件成立的最终间隔。真正的解决方案是在此间隔内的某个地方。

,

您可以使用 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,boost::math::tools::eps_tolerance<double>());

  std::cout << "Result " << result.first << "," << result.second;

  return 0;
}

打印:

Result 1.41421,1.41421

您可以在此处{@ 3}了解有关lambda和lambda捕获的信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?