gsl 多根迭代尝试 nan?

Nov*_*e C 5 c gsl

我正在尝试找到正确的参数输入到我的代码中以产生所需的结果。我没有猜测和检查,而是使用根查找来查找给出所需结果的参数。有两个变量可以自由变化,但我在运行根查找器时遇到困难。我更改了代码以单独求解每个变量,并发现我在优化一个变量时遇到了麻烦。

问题似乎是 gsl_multiroot_iterate 在第一次迭代后猜测 nan 为 x1 。至少,当我为 x1 放入 printf 语句时,x1 的值在该点之后的 function() 调用中返回。

我正在运行的模拟仅允许 x1 的值在 0 和 1 之间。这可能会导致问题,尽管我检查模拟以确保 x1 在 0 和 1 之间,并且除了 x1 时之外不会引发问题是南。无论如何,是否可以为迭代尝试 x1 的值设置一个范围?有人知道使用 nan 作为 x1 的迭代会尝试什么吗?

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_multiroots.h>

struct rparams{
    double target1;
};

int function(const gsl_vector * x, void *params, gsl_vector * f);

int main(int argc, char* argv[]) {

    double target1;
    sscanf(argv[1],"%lf",&target1);

    const gsl_multiroot_fsolver_type *T;
    gsl_multiroot_fsolver *s;

    int status;
    unsigned int iter = 0;

    const size_t n = 1;
    struct rparams p;
    p.target1 = target1;

    gsl_multiroot_function f = {&function, n, &p};

    double x_init[1] = {.1};
    gsl_vector * x = gsl_vector_alloc(n);

    gsl_vector_set(x, 0, x_init[0]);

    T = gsl_multiroot_fsolver_hybrid;
    s = gsl_multiroot_fsolver_alloc(T, 1);
    gsl_multiroot_fsolver_set(s, &f, x);

    print_state(iter, s);

    do
    {
        iter++;
        status = gsl_multiroot_fsolver_iterate (s);

        print_state(iter, s);

        /* check if solver is stuck */
        if (status){
            break;
        }

        status = gsl_multiroot_test_residual (s->f, 1e-7);
    }
    while (status == GSL_CONTINUE && iter < 1000);

    printf("status = %s\n", gsl_strerror (status));

    gsl_multiroot_fsolver_free (s);
    gsl_vector_free (x);
    return 0;
}

int function(const gsl_vector * x, void *params, gsl_vector * f){

    double target1 = ((struct rparams *) params)->target1;

    double x1 = gsl_vector_get(x, 0);

    /* Run simulation here using x1 parameter */
    /* Assign output to temp1, which I am trying to match to target1 */

    const double y1 = temp1 - target1;

    gsl_vector_set (f, 0, y1);

    return GSL_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

hpi*_*xel 1

设计要从中获取根的函数时要小心。事实上,为了进行测试,我尝试了一个具有恒定输出的函数。这导致算法抛出 NaN。