- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚在 Windows 盒子上设置了 GSL,我正在尝试学习如何使用非线性拟合函数。我做的第一件事就是直接从他们的网站上获取一个示例:https://www.gnu.org/software/gsl/manual/html_node/Example-programs-for-Nonlinear-Least_002dSquares-Fitting.html
在这里:
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_multifit_nlin.h>
#define N 40
#define FIT(i) gsl_vector_get(s->x, i)
#define ERR(i) sqrt(gsl_matrix_get(covar,i,i))
struct data {
size_t n;
double * y;
double * sigma;
};
int expb_f (const gsl_vector * x, void *data, gsl_vector * f)
{
size_t n = ((struct data *)data)->n;
double *y = ((struct data *)data)->y;
double *sigma = ((struct data *) data)->sigma;
double A = gsl_vector_get (x, 0);
double lambda = gsl_vector_get (x, 1);
double b = gsl_vector_get (x, 2);
size_t i;
for (i = 0; i < n; i++)
{
/* Model Yi = A * exp(-lambda * i) + b */
double t = i;
double Yi = A * exp (-lambda * t) + b;
gsl_vector_set (f, i, (Yi - y[i])/sigma[i]);
}
return GSL_SUCCESS;
}
int expb_df (const gsl_vector * x, void *data, gsl_matrix * J)
{
size_t n = ((struct data *)data)->n;
double *sigma = ((struct data *) data)->sigma;
double A = gsl_vector_get (x, 0);
double lambda = gsl_vector_get (x, 1);
size_t i;
for (i = 0; i < n; i++)
{
/* Jacobian matrix J(i,j) = dfi / dxj, */
/* where fi = (Yi - yi)/sigma[i], */
/* Yi = A * exp(-lambda * i) + b */
/* and the xj are the parameters (A,lambda,b) */
double t = i;
double s = sigma[i];
double e = exp(-lambda * t);
gsl_matrix_set (J, i, 0, e/s);
gsl_matrix_set (J, i, 1, -t * A * e/s);
gsl_matrix_set (J, i, 2, 1/s);
}
return GSL_SUCCESS;
}
int expb_fdf (const gsl_vector * x, void *data, gsl_vector * f, gsl_matrix * J)
{
expb_f (x, data, f);
expb_df (x, data, J);
return GSL_SUCCESS;
}
void print_state (size_t iter, gsl_multifit_fdfsolver * s);
int main (void)
{
const gsl_multifit_fdfsolver_type *T;
gsl_multifit_fdfsolver *s;
int status;
unsigned int i, iter = 0;
const size_t n = N;
const size_t p = 3;
gsl_matrix *covar = gsl_matrix_alloc (p, p);
double y[N], sigma[N];
struct data d = { n, y, sigma};
gsl_multifit_function_fdf f;
double x_init[3] = { 1.0, 0.0, 0.0 };
gsl_vector_view x = gsl_vector_view_array (x_init, p);
const gsl_rng_type * type;
gsl_rng * r;
gsl_rng_env_setup();
type = gsl_rng_default;
r = gsl_rng_alloc (type);
f.f = &expb_f;
f.df = &expb_df;
f.fdf = &expb_fdf;
f.n = n;
f.p = p;
f.params = &d;
/* This is the data to be fitted */
for (i = 0; i < n; i++)
{
double t = i;
y[i] = 1.0 + 5 * exp (-0.1 * t) + gsl_ran_gaussian (r, 0.1);
sigma[i] = 0.1;
printf ("data: %u %g %g\n", i, y[i], sigma[i]);
};
T = gsl_multifit_fdfsolver_lmsder;
s = gsl_multifit_fdfsolver_alloc (T, n, p);
gsl_multifit_fdfsolver_set (s, &f, &x.vector);
print_state (iter, s);
do
{
iter++;
status = gsl_multifit_fdfsolver_iterate (s);
printf ("status = %s\n", gsl_strerror (status));
print_state (iter, s);
if (status)
break;
status = gsl_multifit_test_delta (s->dx, s->x,
1e-4, 1e-4);
}
while (status == GSL_CONTINUE && iter < 500);
gsl_multifit_covar (s->J, 0.0, covar);
{
double chi = gsl_blas_dnrm2(s->f);
double dof = n - p;
double c = GSL_MAX_DBL(1, chi / sqrt(dof));
printf("chisq/dof = %g\n", pow(chi, 2.0) / dof);
printf ("A = %.5f +/- %.5f\n", FIT(0), c*ERR(0));
printf ("lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1));
printf ("b = %.5f +/- %.5f\n", FIT(2), c*ERR(2));
}
printf ("status = %s\n", gsl_strerror (status));
gsl_multifit_fdfsolver_free (s);
gsl_matrix_free (covar);
gsl_rng_free (r);
return 0;
}
void print_state (size_t iter, gsl_multifit_fdfsolver * s)
{
printf ("iter: %3u x = % 15.8f % 15.8f % 15.8f "
"|f(x)| = %g\n",
iter,
gsl_vector_get (s->x, 0),
gsl_vector_get (s->x, 1),
gsl_vector_get (s->x, 2),
gsl_blas_dnrm2 (s->f));
}
理想情况下,它应该简单地生成一个简短的数据集,该数据集遵循衰减指数,顶部有一些白噪声,然后对其进行拟合。
为了让它在 Windows 中的 Code::Blocks 中运行,我按照此处概述的过程进行操作:installing GSL on Windows XP 32bit for use with codeblocks
即使使用 -Wall 和 -Wextra 标志,它也可以在没有警告的情况下进行编译。但是,它在以下行上失败:gsl_multifit_fdfsolver_set (s, &f, &x.vector);
,并出现错误:multifit\fdfsolver.c:132:错误: vector 长度与求解器不匹配。调用默认 GSL 错误处理程序。
我有点惊讶地发现这个应该是原始示例代码,但我们在这里。所以我希望有比我更有知识的人能告诉我这个简单的例子做错了什么。
最佳答案
发现了:他们错误地分配了初始 vector 。固定代码在这里:
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_multifit_nlin.h>
#define N 40
#define FIT(i) gsl_vector_get(s->x, i)
#define ERR(i) sqrt(gsl_matrix_get(covar,i,i))
struct data {
size_t n;
double * y;
double * sigma;
};
int expb_f (const gsl_vector * x, void *data, gsl_vector * f)
{
size_t n = ((struct data *)data)->n;
double *y = ((struct data *)data)->y;
double *sigma = ((struct data *) data)->sigma;
double A = gsl_vector_get (x, 0);
double lambda = gsl_vector_get (x, 1);
double b = gsl_vector_get (x, 2);
size_t i;
for (i = 0; i < n; i++)
{
/* Model Yi = A * exp(-lambda * i) + b */
double t = i;
double Yi = A * exp (-lambda * t) + b;
gsl_vector_set (f, i, (Yi - y[i])/sigma[i]);
}
return GSL_SUCCESS;
}
int expb_df (const gsl_vector * x, void *data, gsl_matrix * J)
{
size_t n = ((struct data *)data)->n;
double *sigma = ((struct data *) data)->sigma;
double A = gsl_vector_get (x, 0);
double lambda = gsl_vector_get (x, 1);
size_t i;
for (i = 0; i < n; i++)
{
/* Jacobian matrix J(i,j) = dfi / dxj, */
/* where fi = (Yi - yi)/sigma[i], */
/* Yi = A * exp(-lambda * i) + b */
/* and the xj are the parameters (A,lambda,b) */
double t = i;
double s = sigma[i];
double e = exp(-lambda * t);
gsl_matrix_set (J, i, 0, e/s);
gsl_matrix_set (J, i, 1, -t * A * e/s);
gsl_matrix_set (J, i, 2, 1/s);
}
return GSL_SUCCESS;
}
int expb_fdf (const gsl_vector * x, void *data, gsl_vector * f, gsl_matrix * J)
{
expb_f (x, data, f);
expb_df (x, data, J);
return GSL_SUCCESS;
}
void print_state (size_t iter, gsl_multifit_fdfsolver * s);
int main (void)
{
const gsl_multifit_fdfsolver_type *T;
gsl_multifit_fdfsolver *s;
int status;
unsigned int i, iter = 0;
const size_t n = N;
const size_t p = 3;
gsl_matrix *covar = gsl_matrix_alloc (p, p);
double y[N], sigma[N];
struct data d = { n, y, sigma};
gsl_multifit_function_fdf f;
gsl_vector *x = gsl_vector_alloc(p);
for (i=0; i<p; i++)
{
gsl_vector_set(x,i,i==0 ? 1 : 0);
}
const gsl_rng_type * type;
gsl_rng * r;
gsl_rng_env_setup();
type = gsl_rng_default;
r = gsl_rng_alloc (type);
f.f = &expb_f;
f.df = &expb_df;
f.fdf = &expb_fdf;
f.n = n;
f.p = p;
f.params = &d;
/* This is the data to be fitted */
for (i = 0; i < n; i++)
{
double t = i;
y[i] = 1.0 + 5 * exp (-0.1 * t) + gsl_ran_gaussian (r, 0.1);
sigma[i] = 0.1;
printf ("data: %u %g %g\n", i, y[i], sigma[i]);
};
T = gsl_multifit_fdfsolver_lmsder;
s = gsl_multifit_fdfsolver_alloc (T, n, p);
gsl_multifit_fdfsolver_set (s, &f, x);
print_state (iter, s);
do
{
iter++;
status = gsl_multifit_fdfsolver_iterate (s);
printf ("status = %s\n", gsl_strerror (status));
print_state (iter, s);
if (status)
break;
status = gsl_multifit_test_delta (s->dx, s->x,
1e-4, 1e-4);
}
while (status == GSL_CONTINUE && iter < 500);
gsl_multifit_covar (s->J, 0.0, covar);
{
double chi = gsl_blas_dnrm2(s->f);
double dof = n - p;
double c = GSL_MAX_DBL(1, chi / sqrt(dof));
printf("chisq/dof = %g\n", pow(chi, 2.0) / dof);
printf ("A = %.5f +/- %.5f\n", FIT(0), c*ERR(0));
printf ("lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1));
printf ("b = %.5f +/- %.5f\n", FIT(2), c*ERR(2));
}
printf ("status = %s\n", gsl_strerror (status));
gsl_multifit_fdfsolver_free (s);
gsl_matrix_free (covar);
gsl_rng_free (r);
gsl_vector_free(x);
return 0;
}
void print_state (size_t iter, gsl_multifit_fdfsolver * s)
{
printf ("iter: %3u x = % 15.8f % 15.8f % 15.8f "
"|f(x)| = %g\n",
iter,
gsl_vector_get (s->x, 0),
gsl_vector_get (s->x, 1),
gsl_vector_get (s->x, 2),
gsl_blas_dnrm2 (s->f));
}
关于c - 基本GSL示例程序中的错误-简单的非线性拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31618351/
我正在编写一些代码,其中使用了一些 GNU GSL 函数。 出于纯粹的兴趣,我想知道这些功能是如何实现的,因此我想看看源代码。 问题是我似乎无法找到它所在的目录。 我知道我可以在“/usr/local
我需要计算 ∫ [x₁ to x₂] 1/√(1-k² sinh²(x)) dx 在我的程序中。这可以使用在复数参数中评估的第一类不完全椭圆积分来表示: -i (F(ix₂ | -k²) - F(ix
brew install gsl - 没问题 快速制作一个使用 gsl 的 Mac 应用程序,以检查它是否正常工作。 ( Handy example here. ) - 没问题 它们在/include
给定以下函数,采用:只读 float 跨度(动态或任何静态大小): template void foobar(gsl::span x); 假设我有一个 vector .将其作为参数传递是行不通的,但
C++ Core Guidelines促进实践using span . 问题在于 const 和可变范围。这是我尝试做的: auto foo(gsl::span); // 1st au
我正在尝试获取一个名为 emergent 的软件在职的。它依赖于我已经安装的 qt 和 coin。 但是当我尝试运行 emergent 时,出现以下错误: dyld: Library not load
假设我有一个成员变量std::vector在一个类中,我想使用 gsl::array_view 的组合从成员函数返回它作为不可变 View 和 gsl::cstring_view .不幸的是,以下内容
我正在尝试计算两个 vector a 和 b 之间的马氏距离。最终,我将使用它作为统计算法中的距离度量。我正在使用 gsl 来实现它们。马氏距离的公式是 sqrt((a-b)'c^-1(a-b)),其
我正在将指南支持库检查器集成到我的项目中。 Microsoft.CppCoreCheck Microsoft.Gsl 当我运行它时,我从包含的库(如标准库、glm、boost 等)中收到一堆错误。 一
我记得读过 mat4x3 比 mat3x4 使用了更多的寄存器,因为它有四列,即使它们具有相同数量的元素。我似乎无法在任何地方找到它了。新规范是否对两种类型的矩阵使用相同数量的统一寄存器? 转置是否也
我想使用 GSL 的统一随机数生成器。在他们的网站上,他们包含以下示例代码: #include #include int main (void) { const gsl_rng_t
我最近安装了 GSL,用于我的计算作业。我从预构建的库安装了它,并将其链接到 CodeBlocks,然后运行 GSL(贝塞尔函数)的测试示例以确保它有效。一切都很顺利。 然后我尝试了这里给出的线性
我现在正在与 GSL 合作。我在寻找特征值时遇到一些问题。在对称矩阵的情况下,GSL 似乎没有正确给出特征值。我给出了某些对称矩阵的输入,这些矩阵的特征值应该为 0,但是,GSL 函数返回非零特征值来
构建后: $ gcc generator.c -lm -lgsl -lgslcblas -lm 代码: #include #include gsl_rng * r; /* global gene
我正在使用 GSL 进行大量三次样条插值。假设我有三个自变量 a、b 和 c,所有变量都在相同的物理数据点上制表(可能是同一组位置)以米、英尺和英里为单位),以及两个因变量 y 和 z,在相同点处制表
我目前正在尝试在另一个自己编写的库(Quaternion.c)中使用我之前编写的库(matrix.c),方法是使用使用“matrix.h”的标准方法通过头文件调用它”包含“matrix.c”文件中的函
我正在尝试更新旧代码,该代码使用的是具有已弃用函数的 GSL 版本,但我在寻找如何使用新版本的归一化勒让德多项式函数时遇到了麻烦。这是总结问题的片段: #include #include #inc
我正在使用 GSL 示例页面上的代码来尝试求解一个包含四个微分方程的系统。我一直在努力将五个参数传递给 ODE 系统,并且遇到了一个最终的(我希望!)编译时错误。下面是一个片段,给我错误 114:57
我已经在 Kubuntu 14.04 中安装了最新版本的 GSL (1.16)。我使用库附带的文件 INSTALL(逐步)进行安装。我配置了 eclipse-cdt 环境以供使用。它工作,我认为,因为
我有一个非常简单的问题——我只想在 C 语言的 gsl 中将两个具有复杂条目的矩阵相乘。例如,我想定义一个函数 gsl_matrix_complex *multiply( gsl_matrix_com
我是一名优秀的程序员,十分优秀!