因此,虽然我很高兴在 Stack Overflow 上找到了很多答案,但我决定是时候自己问一个问题了。
我正在尝试使用 a root finding algorithm with derivatives .根据 GSL,我必须提前定义函数及其导数。但我想知道是否可以使用包装器更优雅地完成此操作。
前段时间我发现了一个非常方便的 template (GSL C++ wrapper)这适用于一个功能,例如集成并且我大量使用它。
现在我想知道是否可以扩展这种方法为 GSL 提供两个函数,即函数本身及其派生函数。
编辑:解决方案
template <typename F, typename G>
class gsl_root_deriv : public gsl_function_fdf
{
private:
const F& _f;
const G& _df;
static double invoke_f(double x, void* params){
return static_cast<gsl_root_deriv*>(params) -> _f(x);
}
static double invoke_df(double x, void* params){
return static_cast<gsl_root_deriv*>(params) -> _df(x);
}
static void invoke_fdf(double x, void* params, double* f, double* df){
(*f) = static_cast<gsl_root_deriv*>(params) -> _f(x);
(*df) = static_cast<gsl_root_deriv*>(params) -> _df(x);
}
public:
gsl_root_deriv(const F& f_init, const G& df_init)
: _f(f_init), _df(df_init)
{
f = &gsl_root_deriv::invoke_f;
df = &gsl_root_deriv::invoke_df;
fdf = &gsl_root_deriv::invoke_fdf;
params = this;
}
};
还有一个类似于 the example from the GSL 的最小示例:
#include <iostream>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_roots.h>
#include <memory>
#include "gsl_root_deriv.h"
int main()
{
auto f = [](double x) -> double { return 0.25 * x*x - 1.0; };
auto df = [](double x) -> double { return 0.5 * x; };
gsl_root_deriv<decltype(f),decltype(df)> Fp(f,df);
int status(0), iter(0), max_iter(100);
const gsl_root_fdfsolver_type* T( gsl_root_fdfsolver_newton);
std::unique_ptr<gsl_root_fdfsolver,void(*)(gsl_root_fdfsolver*)>
s(gsl_root_fdfsolver_alloc(T),gsl_root_fdfsolver_free);
double x_0(0.0), x(5.0);
gsl_root_fdfsolver_set( s.get(), &Fp, x );
do
{
iter++;
std::cout << "Iteration " << iter << std::endl;
status = gsl_root_fdfsolver_iterate( s.get() );
x_0 = x;
x = gsl_root_fdfsolver_root( s.get() );
status = gsl_root_test_delta( x, x_0, 0.0, 1.0e-3 );
} while( status == GSL_CONTINUE && iter < max_iter );
std::cout << "Converged to root " << x << std::endl;
return 0;
}
亲切的问候,
——克劳斯
最佳答案
你需要做一些修改
Gsl fdf结构如下
struct gsl_function_fdf_struct
{
double (* f) (double x, void * params);
double (* df) (double x, void * params);
void (* fdf) (double x, void * params, double * f, double * df);
void * params;
};
typedef struct gsl_function_fdf_struct gsl_function_fdf ;
如果您了解包装器的实际作用,那么您会发现泛化非常简单
class gsl_function_fdf_pp : public gsl_function_fdf
{
public:
gsl_function_fdf_pp
(
std::function<double(double)> const& kf,
std::function<double(double)> const& kdf
) : _f(kf), _df(kdf)
{
f = &gsl_function_fdf_pp::invoke;
df = &gsl_function_fdf_pp::invoke2;
fdf = &gsl_function_fdf_pp::invoke3;
params=this;
}
private:
std::function<double(double)> _f;
std::function<double(double)> _df;
static double invoke(double x, void *params)
{
return static_cast<gsl_function_fdf_pp*>(params)->_f(x);
}
static double invoke2(double x, void *params)
{
return static_cast<gsl_function_fdf_pp*>(params)->_df(x);
}
static void invoke3(double x, void * params, double* f, double* df)
{
(*f) = static_cast<gsl_function_fdf_pp*>(params)->_f(x);
(*df) = static_cast<gsl_function_fdf_pp*>(params)->_df(x);
}
};
模板版本。
template< typename F, typename U > class gsl_function_fdf_pp : public gsl_function_fdf
{
public:
gsl_function_fdf_pp(const F& kf, const U& kdf) : _f(kf), _df(kdf)
{
f = &gsl_function_fdf_pp::invoke;
df = &gsl_function_fdf_pp::invoke2;
fdf = &gsl_function_fdf_pp::invoke3;
params=this;
}
private:
const F& _f;
const U& _df;
static double invoke(double x, void *params)
{
return static_cast<gsl_function_fdf_pp*>(params)->_f(x);
}
static double invoke2(double x, void *params)
{
return static_cast<gsl_function_fdf_pp*>(params)->_df(x);
}
static void invoke3(double x, void * params, double* f, double* df)
{
(*f) = static_cast<gsl_function_fdf_pp*>(params)->_f(x);
(*df) = static_cast<gsl_function_fdf_pp*>(params)->_df(x);
}
};
EDIT2:修复了 2 个小问题后,这个例子就可以运行了
int main()
{
auto f = [](double x)->double{ return x*x; };
auto df = [](double x)->double{ return 2.0 * x; };
gsl_function_fdf_pp<decltype(f),decltype(df)> Fp(f,df);
return 0;
}
关于用于具有导数的 GSL 根查找算法的 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594152/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非