注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

GSL Multidimensional Minimization 完整示例  

2012-05-02 12:41:23|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

即以此功德,庄严佛净土。上报四重恩,下济三途苦。惟愿见闻者,悉发菩提心。在世富贵全,往生极乐国。

缘起: GSL 参考手册中多维最优化的求解没有给出完整的例子,这给初学者带来了不便。我今天花了一上午时间专门研究了下如何使用GSL提供的多维最优化函数,下面讲完整的代码贴出来,目的是减少大家摸索学习的时间,更快的掌握此工具,解决实际问题。

(1) multiDimMini.h

#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_multimin.h>

/* Paraboloid centered on (p[0],p[1]), with 
 scale factors (p[2],p[3]) and minimum p[4] */
 
 double
 my_f (const gsl_vector *v, void *params)
 {
   double x, y;
   double *p = (double *)params;
  
   x = gsl_vector_get(v, 0);
   y = gsl_vector_get(v, 1);
 
   return p[2] * (x - p[0]) * (x - p[0]) +
   p[3] * (y - p[1]) * (y - p[1]) + p[4];
 }
 
 /* The gradient of f, df = (df/dx, df/dy). */
 void
 my_df (const gsl_vector *v, void *params,
  gsl_vector *df)
 {
   double x, y;
   double *p = (double *)params;
  
   x = gsl_vector_get(v, 0);
   y = gsl_vector_get(v, 1);
 
   gsl_vector_set(df, 0, 2.0 * p[2] * (x - p[0]));
   gsl_vector_set(df, 1, 2.0 * p[3] * (y - p[1]));
 }
 
 /* Compute both f and df together. */
 void
 my_fdf (const gsl_vector *x, void *params,
   double *f, gsl_vector *df)
 {
   *f = my_f(x, params);
   my_df(x, params, df);
 }

(2)multiDimMini.c

#include "multiDimMini.h"
int main( void )
{
    size_t iter = 0;
    int status;

    const gsl_multimin_fdfminimizer_type *T;
    gsl_multimin_fdfminimizer *s;

    /* Position of the minimum (1,2), scale factors
       10,20, height 30. */
    double par[5] = { 1.0, 2.0, 10.0, 20.0, 30.0 };

    gsl_vector *x;
    gsl_multimin_function_fdf my_func;

    my_func.n = 2;
    my_func.f = my_f;
    my_func.df = my_df;
    my_func.fdf = my_fdf;
    my_func.params = par;

    /* Starting point, x = (5,7) */
    x = gsl_vector_alloc( 2 );
    gsl_vector_set( x, 0, 5.0 );
    gsl_vector_set( x, 1, 7.0 );

    T = gsl_multimin_fdfminimizer_conjugate_fr;
    s = gsl_multimin_fdfminimizer_alloc( T, 2 );

    gsl_multimin_fdfminimizer_set( s, &my_func, x, 0.01, 1e-4 );

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

        if ( status )
            break;

        status = gsl_multimin_test_gradient( s->gradient, 1e-3 );

        if ( status == GSL_SUCCESS )
            printf( "Minimum found at:\n" );

        printf( "%5d %.5f %.5f %10.5f\n", iter,
                gsl_vector_get( s->x, 0 ),
                gsl_vector_get( s->x, 1 ),
                s->f );

    }
    while ( status == GSL_CONTINUE && iter < 100 );

    gsl_multimin_fdfminimizer_free( s );

    gsl_vector_free( x );

    return 0;
}

  评论这张
 
阅读(1199)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016