我正在尝试找到正确的参数输入到我的代码中以产生所需的结果。我没有猜测和检查,而是使用根查找来查找给出所需结果的参数。有两个变量可以自由变化,但我在运行根查找器时遇到困难。我更改了代码以单独求解每个变量,并发现我在优化一个变量时遇到了麻烦。
问题似乎是 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)
| 归档时间: |
|
| 查看次数: |
798 次 |
| 最近记录: |