设为首页 加入收藏

TOP

用C++实现可重用的数学例程
2014-11-23 21:32:11 】 浏览:444
Tags:实现 重用 数学


  引言


  “代码重用”是软件工程追求的神圣目标之一。采用面向对象(object-oriented, OO)的程序设计方法的一个主要方面也就是为了代码重用,这可以从任何介绍OO程序设计的书籍看得出来。然而实际应用中,使用C++一类的OO语言来实现代码重用比我们想象的要难得多。事实上,正如一位作者所说,由于C++程序员普遍倾向于创建自己的容器类,“C++对科学计算软件的可重用性造成了很大的阻碍”。


  在本文中,我展示了怎样用C++语言创建可重用的数学例程。相对于OO来说,我使用的方法更依赖于通用编程(Generic Programming)。为了讨论的方便,我使用了一个广泛应用的估计算法――Newton-Raphson算法来作为例子。Newton-Raphson算法必须调用一个用户定义的函数。本文首先给出了用户定义函数的典型(并不让人满意)封装方法,然后提出了一种建立在模板和操作符重载基础上的更加令人满意的封装方式。


  Newton-Raphson算法


  在科学计算和财经工程领域,许多数值算法都是通用的(至少在理论上是),可广泛地用于解决一类问题。一个大家熟悉的例子就是Newton-Raphson例程,它可用来寻找方程f(x)=0的数值解。标准的数学表达式f(x)表示f是变量x的函数,其通常的表达形式为f(x,a,b,...)=0,f被定义为多于一个变量的函数。在这种情况下,Newton-Raphson算法试图把x以外的变量固定并作为参数,而寻找关于变量x的数值解。


  由于Newton-Raphson算法需要知道被求解函数的确切表达,其传统实现方法是直接将代码嵌入到客户应用程序中。这就使得算法的实现代码经过针对不同被求解函数的少量修改后在客户程序中反复出现。


  同许多其它数学例程一样,Newton-Raphson算法的具体实现是应该与特定用户无关的。并且,重复编码在任何情况下都应该尽量避免。我们很自然地会想到把该类例程作为库函数来实现,以使客户程序可以直接调用它们。但是,这种实现方式必然会涉及到如何将用户自定义函数(Newton-Raphson例程需要调用该函数)封装成可以作为参数传递的形式。下面部分描述了一种通常的,也是存在很多问题的用户定义函数封装方法。


  通常的实现途径――函数指针


  现在的任务就是把Newton-Raphson算法作为一个库例程来实现,客户程序可以直接调用该例程来对任何形如f(x,a,b,..)=0的方程求取关于x的数值解。问题的关键就是算法的实现必须使用(能够调用)f(x,a,b,...)形式的通用函数,而该函数的具体定义由库的用户在以后提供,并且只能在运行时才提交给库。对于C和C++程序员,一种自然的可能方式就是把函数指针作为参数传递给库例程:



  另一种想法就是利用可选参数,如下面语句所示:



  当然还有其它的传递多参数函数的途径,比如说可使用函数外壳。但是这种方法对于作者来说,除了求助于全局变量以外,并不清楚该怎样去做。


  为使其简化,就需要使用一组包含了一定参数的构造,这些构造定义了复杂的用户函数,并为库例程通过传递单个参数来调用这个函数提供了途径。这就将是一个对象――一个纯粹并简单的对象。因此,我为通用函数f(x,a,b,...)定义了一个类,并将其命名为FuncObj。(为了简化叙述,从现在开始,参数的个数被固定为3个。)


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++程序设计从零开始之何谓变量 下一篇C和C++里面的lvalue和rvalue的释义

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目