考虑来自minimzation上的GNU网站的以下示例。假设我需要从一组点(xa,ya)中插值目标函数来获得目标函数double fn2(double x){gsl_interp_eval( myinterp, xa[],ya[],x),而不是给定的目标函数。问题是如何避免每次调用时都必须在目标函数fn2内设置插值myinterp对象,而是将其作为参数传递给目标函数。我已经尝试了一个结构,但是没有成功。
我猜更一般的提问方式是“如何将类型为gsl_interp的对象传递给类型为gsl_function的函数?”
#include <stdio.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_min.h>
double fn1 (double x, void * params)
{
return cos(x) + 1.0;
}
int
main (void)
{
int status;
int iter = 0, max_iter = 100;
const gsl_min_fminimizer_type *T;
gsl_min_fminimizer *s;
double m = 2.0, m_expected = M_PI;
double a = 0.0, b = 6.0;
gsl_function F;
F.function = &fn1;
F.params = 0;
T = gsl_min_fminimizer_brent;
s = gsl_min_fminimizer_alloc (T);
gsl_min_fminimizer_set (s, &F, m, a, b);
printf ("using %s method\n",
gsl_min_fminimizer_name (s));
printf ("%5s [%9s, %9s] %9s %10s %9s\n",
"iter", "lower", "upper", "min",
"err", "err(est)");
printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
iter, a, b,
m, m - m_expected, b - a);
do
{
iter++;
status = gsl_min_fminimizer_iterate (s);
m = gsl_min_fminimizer_x_minimum (s);
a = gsl_min_fminimizer_x_lower (s);
b = gsl_min_fminimizer_x_upper (s);
status
= gsl_min_test_interval (a, b, 0.001, 0.0);
if (status == GSL_SUCCESS)
printf ("Converged:\n");
printf ("%5d [%.7f, %.7f] "
"%.7f %+.7f %.7f\n",
iter, a, b,
m, m - m_expected, b - a);
}
while (status == GSL_CONTINUE && iter < max_iter);
gsl_min_fminimizer_free (s);
return status;
}发布于 2013-07-24 20:35:16
对不起,我犯了一个错误,希望没有浪费任何人的时间。我在结构中声明了类似于
struct myint = { double a; gsl_interp int;};也就是说,我的gsl_interp对象的名字是int。这并不是很聪明,因为int当然是一个类型声明。
https://stackoverflow.com/questions/17831297
复制相似问题