我想使用自适应步骤方案集成一个将3D点(由TRANSFORM First(MySubQuery.Itemimage) AS FirstOfItemimage
SELECT MySubQuery.Itemcode
FROM (SELECT [Itemcode], 'Itemimage' & [Number] AS ColumnName, [Itemimage] FROM Table1) AS MySubQuery
GROUP BY MySubQuery.Itemcode
PIVOT MySubQuery.ColumnName;
参数化)映射到2D点(复平面)的函数。我的函数的导数没有封闭形式,它是非线性的。
我已尝试以下操作以查看代码是否有效。它编译但结果是错误的。正在集成的测试函数(t
从t
到0
; 1
是复数)是
Exp [-Norm [{1.1,2.4,3.6} * t] * i]
预期结果是
-0.217141 - 0.279002 i
i
代码输出
5051 + 0 i
我怀疑问题出在我对#include <iostream>
#include <complex>
#include <boost/numeric/ublas/vector.hpp>
namespace ublas = boost::numeric::ublas;
#include <boost/numeric/odeint.hpp>
namespace odeint = boost::numeric::odeint;
typedef std::complex<double> state_type;
class Integrand {
ublas::vector<double> point_;
public:
Integrand(ublas::vector<double> point){
point_ = point;
}
void operator () (const state_type &x, state_type &dxdt, const double t){
point_ *= t;
const std::complex<double> I(0.0, 1.0);
dxdt = std::exp( -norm_2(point_)*I );
}
};
std::complex<double> integral(ublas::vector<double> pt) {
typedef odeint::runge_kutta_cash_karp54< state_type > error_stepper_type;
double err_abs = 1.0e-10;
double err_rel = 1.0e-6;
state_type x = std::complex<double>(1.0, 0.0);
return odeint::integrate_adaptive(
odeint::make_controlled<error_stepper_type>(err_abs, err_rel),
Integrand(pt), x, 0.0, 1.0, 0.001);
}
int main() {
ublas::vector<double> pt(3);
pt(0) = 1.1;
pt(1) = 2.4;
pt(2) = 3.6;
std::cout << integral(pt) << std::endl;
return 0;
}
状态向量的定义中。我不知道应该是什么。
答案 0 :(得分:2)
我怀疑您的问题是因为您每次拨打Integrand::operator()
时都在修改point_ *= t;
dxdt = exp(-norm_2(point_)*I);
。
而不是:
dxdt = exp(-norm_2(point_ * t) * I);
你可能意味着:
x
当你没有要更改的成员变量时,你的Integrand :: operator()应该被标记为const函数,这有助于将来捕获这些错误。
在查看odeint的文档后,integrate_adaptive将返回执行的步骤数。输入参数odeint::integrate_adaptive(
odeint::make_controlled<error_stepper_type>(err_abs, err_rel),
Integrand(pt), x, 0.0, 1.0, 0.001);
return x;
实际上保存了最终结果,因此您希望这样做:
(0.782859,-0.279002)
运行此打印x
,这仍然不是您正在寻找的答案。您正在寻找的答案是在0
而不是1
处开始state_type x = std::complex<double>(0.0, 0.0);
odeint::integrate_adaptive(
odeint::make_controlled<error_stepper_type>(err_abs, err_rel),
Integrand(pt), x, 0.0, 1.0, 0.001);
return x;
的结果。
GetSecretAsyn()