- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我打算在 MCMC 例程中使用 Boost odeint 库来估计 ODE 模型中的参数。由于这些 ODE 可能是刚性的,我需要能够将雅可比矩阵传递到具有导数的求解器中。我想创建一个类,它具有作为私有(private)成员的参数和初始值,然后是派生类、jacobian 和将参数更改为公共(public)方法的方法。我试图修改 odeint 网站上的僵硬示例,以使用一个包含两者的类,但在编译时收到错误“错误:没有匹配函数调用‘Fitzhugh::deriv()’”。我不是经验丰富的 C++ 程序员,所以这很可能是概念上的错误。这是代码。
/* Fitzhugh Nagumo Equation in odeint */
#include <iostream>
#include <fstream>
#include <utility>
#include <cmath>
#include <boost/numeric/odeint.hpp>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator.hpp>
using namespace std;
using namespace boost::numeric::odeint;
namespace phoenix = boost::phoenix;
//[ stiff_system_definition
typedef boost::numeric::ublas::vector< double > vector_type;
typedef boost::numeric::ublas::matrix< double > matrix_type;
class Fitzhugh
{
private:
double a;
double b;
double c;
public:
Fitzhugh( double a_, double b_, double c_ ) : a(a_), b(b_), c(c_) { }
void deriv ( const vector_type &x , vector_type &dxdt , double )
{
dxdt[ 0 ] = c*(x[0] - pow(x[0], 3.0)/3.0 + x[1]);
dxdt[ 1 ] = -(x[0] - a + b*x[1])/c;
}
void jac ( const vector_type &x, matrix_type &J , const double & , vector_type &dfdt )
{
J( 0 , 0 ) = c*(1 - pow(x[0], 2.0));
J( 0 , 1 ) = c;
J( 1 , 0 ) = -1/c;
J( 1 , 1 ) = -b/c;
dfdt[0] = 0.0;
dfdt[1] = 0.0;
}
};
int main( int argc , char **argv )
{
// typedef rosenbrock4< double > stepper_type;
// typedef rosenbrock4_controller< stepper_type > controlled_stepper_type;
// typedef rosenbrock4_dense_output< controlled_stepper_type > dense_output_type;
//[ integrate_stiff_system
vector_type x( 2 , 1.0 );
Fitzhugh fitzhugh(0.2, 0.2, 3.0);
size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< double > >( 1.0e-6 , 1.0e-6 ) ,
make_pair( fitzhugh.deriv() , fitzhugh.jac() ) ,
x , 0.0 , 50.0 , 0.01 ,
cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" );
//]
clog << num_of_steps << endl;
return 0;
}
这是完整的输出
/home/chris/C++/examples/fitzhugh/main.cpp: In function ‘int main(int, char**)’:
/home/chris/C++/examples/fitzhugh/main.cpp:60:39: error: no matching function for call to ‘Fitzhugh::deriv()’
/home/chris/C++/examples/fitzhugh/main.cpp:60:39: note: candidate is:
/home/chris/C++/examples/fitzhugh/main.cpp:30:14: note: void Fitzhugh::deriv(const vector_type&, vector_type&, double)
/home/chris/C++/examples/fitzhugh/main.cpp:30:14: note: candidate expects 3 arguments, 0 provided
/home/chris/C++/examples/fitzhugh/main.cpp:60:56: error: no matching function for call to ‘Fitzhugh::jac()’
/home/chris/C++/examples/fitzhugh/main.cpp:60:56: note: candidate is:
/home/chris/C++/examples/fitzhugh/main.cpp:36:14: note: void Fitzhugh::jac(const vector_type&, matrix_type&, const double&, vector_type&)
/home/chris/C++/examples/fitzhugh/main.cpp:36:14: note: candidate expects 4 arguments, 0 provided
最佳答案
要传递成员函数,您需要使用绑定(bind)机制。如果你有一个 c++11 编译器,你可以使用 std::bind;包括 std::placeholders 命名空间:using namespace std::placeholders;
然后使用来自 <functional>
的 std::bind :
make_pair( bind( &Fitzhugh::deriv , &fitzhugh , _1 , _2 , _3 ) ,
bind( &Fitzhugh::jac , &fitzhugh , _1 , _2 , _3, _4 ) )
关于c++ - 使用导数和 jacobian boost odeint 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18928733/
我正在使用 scipy.optimize.minimize 进行优化,并尝试使用以下方法:“Newton-CG”、“dogleg”和“trust-ncg”。据我了解,对于这些方法,需要目标函数的雅可比
我正在尝试对任意多个链接的串行链进行逆运动学。 如下paper ,我找到了如何计算雅可比矩阵的示例。 Entry (i, j) = v[j] * (s[i] - p[j]) 地点: v[j] is t
我想知道下面的代码如何才能更快。目前,它似乎慢得不合理,我怀疑我可能错误地使用了 autograd API。我期望的输出是 timeline 的每个元素在 f 的 jacobian 中求值,我确实得到
当使用 lsqcurvefit 执行非线性最小二乘法拟合时,将 Jacobian 作为输出(即 [x,resnorm,residual,exitflag,output,lambda,jacobian]
我正在尝试计算 (x,y)=(0,0) 处的雅可比行列式,但无法这样做。 import sympy as sp from sympy import * import numpy as np x,y=s
我正在尝试定义一个 custom gradient in TensorFlow对于返回非标量的函数。 问题的简化玩具版本是: import tensorflow as tf @tf.custom_gr
我正在寻找通过 Pytorch 获取函数雅可比行列式的最有效方法,到目前为止已提出以下解决方案: # Setup def func(X): return torch.stack((X.pow(
我打算在 MCMC 例程中使用 Boost odeint 库来估计 ODE 模型中的参数。由于这些 ODE 可能是刚性的,我需要能够将雅可比矩阵传递到具有导数的求解器中。我想创建一个类,它具有作为私有
我正在 Dymola(基于 modelica 的商业软件)中运行系统模型。模型是关于强制对流下多孔物质的传热和传质。我提出这个问题的问题是关于模型模拟过程中产生的错误。 使用模型的当前设置,可以在给定
我正在尝试实现显示的示例 here . 但是当运行代码并使用 Debug模式时,没有返回值。我假设我没有使用正确的旋转轴。 额外的 Unity 细节: Joints 变量是一个游戏对象数组(由 4 个
import math from scipy.optimize import fsolve def sigma(s, Bpu): return s - math.sin(s) - mat
我目前正在使用 SciPy.optimize 中的最小化 (BFGS) 函数来校准我的模型。校准后,参数会不时受到轻微扰动,我想重新使用之前校准的 Jacobian 和 IHessian 作为我的初始
在 scipy.optimize.root 的文档中对于 method = lm,以下是 options 关键字的默认值。 options={'col_deriv': 0, 'diag': None,
有没有办法让 scipy.optimize.minimize 在每次迭代时打印估计梯度的值?我想将它与我正在计算的分析梯度值进行比较。 最佳答案 您可以为 scipy.optimize.minimiz
我正在尝试用 Python 制作 Newton - CG 优化。我的函数是 f(x,y) =(1-x)^2 + 2(y-x^2)^2。初始点:x = 3,y = 2。这是我的代码: from scip
我正在尝试使用 OpenGL、Eigen3 和 "Jacobian pseudoinverse" 实现简单的反向运动学测试方法。 系统使用“Jacobian transpose”算法运行良好,但是,一
我试图了解“dogleg”方法在 Python 的 scipy.optimize.minimize 中是如何工作的功能。我正在调整帮助页面底部的示例。 根据注释,dogleg 方法需要 Jacobia
在 R 中,当您仅提供优化问题的目标函数和约束时,是否可以通过分析找到雅可比/海森/稀疏模式? AMPL 可以做到这一点,据我所知,即使是 MATLAB 也可以做到这一点,但我不知道您是否需要 Kni
我是一名优秀的程序员,十分优秀!