GSL 求解非线性方程

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_multiroots.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_deriv.h>
struct rparams
{
    size_t n;
};

int rosenbrock_f(const gsl_vector* x, void* params, gsl_vector* f)
{
    const double n = ((struct rparams*)params)->n;
    for(size_t i=0; i<n; ++i)
    {
        double xi = gsl_vector_get(x, i);
        double yi = sin(xi)- 0.5;
        gsl_vector_set(f, i, yi);
    }
    return GSL_SUCCESS;
}

int main(void)
{
    const gsl_multiroot_fsolver_type* T;
    gsl_multiroot_fsolver* s;
    std::vector<double> x_init = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
    size_t n = x_init.size();
    struct rparams p = { n };
    gsl_multiroot_function f = { &rosenbrock_f, n, &p };
//    gsl_function_struct g;
    gsl_vector* x = gsl_vector_alloc(n);
    for(size_t i=0; i<x_init.size(); ++i)
    {
        gsl_vector_set(x, i, x_init[i]);
    }

    T = gsl_multiroot_fsolver_hybrids;
    s = gsl_multiroot_fsolver_alloc(T, n);
    gsl_multiroot_fsolver_set(s, &f, x);

    int status = GSL_CONTINUE;
    for(size_t i=0; (status == GSL_CONTINUE) && i < 1000; ++i)
    {
        status = gsl_multiroot_fsolver_iterate(s);
        if(status)
        {
            break;
        }
        status = gsl_multiroot_test_residual(s->f, 1e-7);
    }

    for(size_t i=0; i<n; ++i)
    {
        printf ("% 7.4f", gsl_vector_get (s->x, i));
    }
    printf("\nstatus = %s\n", gsl_strerror(status));
    gsl_multiroot_fsolver_free(s);
    gsl_vector_free(x);
    return 0;
}

// 0.5236    2.6180    2.6180    2.6180    6.8068    6.8068    6.8068    8.9012   8.9012
// 0.5236    2.6180    2.6180    2.6180   13.0900    6.8068    6.8068    6.8068   8.9012
// 0.5236    2.6180    2.6180    2.6180   13.0900    6.8068    6.8068    2.6180   8.9012

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
GSL库是GNU科学库的缩写,它是一个开源的数值计算库,提供了许多数学函数和算法。其中包括非线性最小二乘法的实现。 在Matlab中,也可以使用非线性最小二乘法进行拟合。Matlab提供了lsqcurvefit函数用于拟合非线性模型。该函数的基本语法为: ```matlab [x,resnorm,residual,exitflag,output] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub) ``` 其中,fun是一个自定义的函数,用于计算模型的预测值。x0是待拟合参数的初始猜测值。xdata和ydata是已知的数据点。lb和ub是参数的下界和上界。lsqcurvefit函数会返回最优的参数值x,残差的平方和resnorm,残差residual,以及退出标志exitflag和输出信息output。 使用GSL库或Matlab的非线性最小二乘法可以根据已知的数据点进行拟合,得到最优的参数值,从而实现线性方程的拟合。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [线性最小二乘拟合算法实现-附C++源码](https://blog.csdn.net/lxwyw10902/article/details/78934659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [[最小二乘法] 多边定位--求解未知点坐标](https://blog.csdn.net/summer_dew/article/details/79901654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值