2

我正在使用此处给出的模板程序:

https://www.gnu.org/software/gsl/manual/html_node/Trivial-example.html

他们提供的程序可以完美地编译和运行,这很好。我想做的是推广这种方法以找到具有任意数量参数的函数的最小值。

一些粗略的阅读表明,公制函数 (M1) 仅用于某些诊断和打印情况,因此或多或少可以忽略。剩下的就是适当地定义 E1 和 S1。不幸的是,我对使用指针和 void 的了解并不完整,所以我一直在尝试将配置“xp”升级为参数数组,而不是单个双精度。

在我天真的尝试从

double x =  *((double *) xp);

double x =  (*((double *) xp))[0];

在适当的情况下,但显然这不起作用。我确定我错过了一些愚蠢的东西,所以任何提示都会很好!我显然会定义我自己的 E1 输出函数,它将接受这些 N 个参数并返回一个数字。

4

1 回答 1

0

来自提供的链接的底层算法gsl_siman_solve()被概括为适用于任何数据类型。这就是为什么无处不在的xp参数在使用前总是被强制转换为双指针的原因。如果所有回调都正确编码,那么使用任何结构或数组或数组数组而不是简单的双精度数应该很简单。

问题是它gsl_siman_solve()似乎只支持标量双步长、初始猜测和“统一”值(来自gsl_rng_uniform()),因此您需要将标量双精度值映射到自然多维量。这可以做到,但它很混乱,而且不是很灵活。在您的情况下,映射将在S1().

这类似于将十进制数的数字映射到多维空间:例如,个位代表 X 轴,十位代表 Y 轴,百位代表 Z 轴。通过增加一个整数,可以从 (0, 0, 0) 到 (9, 9, 9) 遍历整个 3D 空间。您不必使用整数和 10 的幂,并且组件甚至不必具有相同的范围,但是打包值的每个组件的范围都有一个固有的限制。您实际上会反过来执行此操作:获取一个标量 double 并将其解压缩为多个数量。

最后,您的代码double x = (*((double *) xp))[0];将无法工作,因为您试图将双精度数作为数组取消引用,而不是指向双精度数的指针,这没关系。换句话说,首先*是问题所在。

于 2015-04-01T19:06:08.700 回答