GSL中的一维最小值

一维最小值

    本章描述了求解任意一维函数最小值的函数。本库为各种迭代求最小值器和收敛测试提供了低级组件。用户可以将这些组合起来以实现所需的解决方案,并完全访问算法的中间步骤。每一类方法都使用相同的框架,因此您可以在运行时在最小化器之间切换,而不需要重新编译程序。求最小值器的每个实例都跟踪自己的状态,允许在多线程程序中使用求最小值器。

    头文件gsl_min.h包含求最小值的函数和相关原型的声明。要使用求最小值算法来找到一个函数的最大值,只需将它的符号反置即可。

37.1 概述

    求最小值算法从已知包含最小值的有界区域开始。该区域由下界a和上界b描述,并估计出最小x的位置,如图37.1所示。

图37.1:具有上下界和最小估计值的函数。

    函数在x处的值必须小于函数在区间结束处的值,

f(a) > f(x) < f(b)

    这个条件保证在区间的某个地方包含一个最小值。在每次迭代中,使用一个可用的算法选择一个新的点x',如果新点是最小值的更好的估计,即:其中f(x') < f(x),则更新当前对最小x的估计值。通过选择最紧凑的满足f(a) > f(x) < f(b)

约束的点集,新点还缩小有界区间的大小。该区间在要求的精度误差内不断减小,直到接近真正的最小值。这提供了最小位置的最佳估计和严格的误差估计。

    在一个框架中可以使用几个交叉算法。用户为算法提供高级驱动程序,本库提供每个步骤所需的单独函数。迭代有三个主要阶段步骤。分别是,

•初始化算法T的最小状态s

•使用迭代T更新s

•测试s收敛性,必要时重复迭代

    求最小值器的状态保存在gsl_min_fminimizer结构体中。更新过程只使用函数求值(而不是导数)。

37.2 警告说明

    注意,求最小值函数一次只能搜索一个最小值。当搜索区域中存在多个最小值时,将返回所找到的第一个最小值;然而,很难预测这是哪一个最小值。在大多数情况下,如果试图在一个有多个最小值的区域中找到最小值,则不会报告任何错误。

所有的求最小值算法都很难确定最小值到全数值精度的位置。函数在最小值x∗区域的行为可以用泰勒展开式来近似,

     这个展开式的第二项在与第一项以有限精度相加时就会丢失。这放大了定位x∗的误差,使其与ϵ 成正比(其中ϵ 是浮点数的相对精度)。对于具有更高阶极小值的函数,如x4,误差的放大程度相应的更差。所能达到的最好的结果是收敛到函数值的数值精度的极限,而不是最小值本身的位置。

37.3 初始化最小值求解器

gsl_min_fminimizer

求解最小值函数的工作空间。

gsl_min_fminimizer * gsl_min_fminimizer_alloc(const gsl_min_fminimizer_type * T)

    本函数返回一个指针,指向新分配的类型为T的最小值求解器的实例。例如,以下代码创建了一个黄金分割最小值求解器的实例:

const gsl_min_fminimizer_type * T = gsl_min_fminimizer_goldensection;

gsl_min_fminimizer * s = gsl_min_fminimizer_alloc (T);

    如果没有足够的内存来创建最小值求解器,则函数返回一个空指针,并使用错误代码GSL_ENOMEM调用错误处理程序。

int gsl_min_fminimizer_set(gsl_min_fminimizer * s, gsl_function * f,

double x_minimum, double x_lower, double x_upper)

    本函数用函数f和初始搜索区间[x_lower, x_upper],设置,或重置一个现有的最小值求解器s,并猜测最小值x_minimum的位置。

如果给定的区间不包含最小值,则函数返回GSL_EINVAL的错误代码。

int gsl_min_fminimizer_set_with_values(gsl_min_fminimizer * s, gsl_function * f,

double x_minimum, double f_minimum, double x_lower,double f_lower, double x_upper, double f_upper)

    本函数等价于gsl_min_fminimizer_set(),但是使用值f_minimum, f_lower和f_upper不是计算f(x_minimum) f(x_lower)和f(x_upper)

void gsl_min_fminimizer_free(gsl_min_fminimizer * s)

    本函数释放与最小值求解器s相关的所有内存。

const char * gsl_min_fminimizer_name(const gsl_min_fminimizer * s)

    本函数返回一个指向最小值求解器名称的指针。例如:

printf ("s is a '%s' minimizer\n", gsl_min_fminimizer_name (s));

    将打印出类似如下内容:s is a 'brent' minimizer.

37.4 提供求最小值函数

    你必须提供一个只有一个变量的连续函数让最小值求解器进行操作。为了允许使用常规参数,函数由gsl_function数据类型定义(提供要解决的函数)。

猜你喜欢

转载自blog.csdn.net/yxmlhc/article/details/120591403