欢迎访问 Forcal程序设计

Forcal数值计算扩展动态库Fc Math V1.0 测试版

目 录

函数及类别 | 开发者及维护者 | 说 明
1 什么是FcMath
2 FcMath数组（矩阵）对象基本用法
3 FcMath常量
math::array | forcal | 用在函数new[math::array,... ...]中，申请数组或矩阵。
math::matrix | forcal | 用在函数new[math::matrix,... ...]中，申请矩阵。
math::rn | forcal | 用在函数new[math::rn,... ...]中，申请数值对象。
math::neg | forcal | math::neg=-1。用在函数math::subg中，表示所有的行或列。
math::pi | forcal | math::pi=3.141592653589793
math::zeros | forcal | 用在函数math::subg中，表示返回全0矩阵。
math::ones | forcal | 用在函数math::subg中，表示返回全1矩阵。
math::eye | forcal | 用在函数math::subg中，表示返回单位矩阵。
math::rand | forcal | 用在函数math::subg中，表示返回0～1之间均匀分布的随机数矩阵。
math::randn | forcal | 用在函数math::subg中，表示返回均值为0，方差为1的标准正态分布的随机数矩阵。
4 FcMath运算符
加法 + | forcal | 数组（矩阵）加法。运行错误：1：数组不存在；2：数组维数太多；3：数组（矩阵）不匹配；4：内存错误。
减法 - | forcal | 数组（矩阵）减法。运行错误：1：数组不存在；2：数组维数太多；3：数组（矩阵）不匹配；4：内存错误。
乘法 * | forcal | 数组（矩阵）乘法。运行错误：1：数组不存在；2：数组维数太多；3：数组（矩阵）不匹配；4：内存错误。 注意：若两个操作对象中有一个是矩阵（该矩阵是用函数matrix申请的），就进行矩阵乘，否则是数组对应元素相乘，或者数组乘以一个数。
除法 / | forcal | 数组除法。运行错误：1：数组不存在；2：数组维数太多；3：数组不匹配；4：内存错误；5：矩阵除法不能使用该运算符。
乘方 ^ | forcal | 数组乘方 。运行错误：1：数组不存在；2：数组维数太多；3：数组不匹配；4：内存错误；5：该运算符的矩阵乘方运算尚未添加。
5 FcMath函数
通用函数 | forcal |
math::minus(n) | forcal | 求n的负值，即返回-n。在oo函数中使用该函数，因为oo函数中直接使用-n将显示错误，运算符“-”是重载的。
常用数学函数 |  |
math::Sin(x) | forcal | 对数组（矩阵）每一元素求正弦，返回一个相同大小的数组（矩阵）。运行错误：1：数组不存在；2：数组维数太多；3：内存错误。 类似的函数还有：Sin、Cos、Tan、Asin、Acos、Atan、Sqrt、Exp、Ln、Lg。
math::Atan2(x,y) | forcal | x和y是数值对象（用函数rn申请）或数组（矩阵），求对应元素的正切值。运行错误：1：数组不存在；2：数组维数太多；3：数组不匹配；4：内存错误。
数（组）函数 |  |
math::rn(x) | forcal | 申请一个数值对象，存放x。
math::array | forcal | 申请数组或矩阵。
math::arrayinit | forcal | 申请数组或矩阵并初始化。
math::arrayinitns | forcal | 申请数组或矩阵并用字符串初始化。
math::outm | forcal | 输出数组或矩阵。
math::Sum | forcal | 数组元素求和。
math::ndgrid | forcal | 生成n维函数的辅助格点阵列。
math::amul(a,b) | forcal | 数组乘。如果a、b是矩阵，也进行数组乘。运行错误：1：数组不存在；2：数组维数太多；3：数组（矩阵）不匹配；4：内存错误。
math::copyarray | forcal | 将多维数组视为一维维数，复制数组数据。copyarray(a,b)将数组b复制到数组a，两数组必须等长；copyarray(a,abegin,b,bbegin,k)将数组b从地址bbegin开始的k个元素复制到数组a的自地址abegin开始的单元。运行错误：1：参数太多或者太少；2：数组不存在；3：数组不匹配。
math::arrayfun(hFor:x1,x2,...,xn:xx) | forcal | 以数组元素为自变量进行函数调用。hFor为实数函数句柄；x1,x2,...,xn:xx为等长的数组（忽略维数）；xx用于存放结果，可缺省。若缺省xx，返回一个数组（在函数oo中返回临时 对象，否则返回一般对象）存放结果，否则该函数返回xx。该函数以数组x1,x2,...,xn的第i个元素为自变量，用函数hFor进行计算，结果存入xx的第i个单元。 运行错误：1：至少需要2个参数；2：指定的表达式不存在；3：数组个数与自变量个数不相等；4：不是实数数组；5：数组长度不匹配；6：内存错误。
矩阵函数 |  |
math::matrix(m,n:x11,x12,... ...) | forcal | 申请m×n矩阵并初始化。初始化数据 x11,x12,...,x1n,x21,x22,...,x2n,... ...,xm1,xm2,...,xmn 可以缺省部分及全部，多余的数据被忽略。 在函数oo中返回临时对象，否则返回一般对象。
math::mmul(a,b) | forcal | 矩阵乘。如果a、b是数组，也进行矩阵乘。运行错误：1：数组不存在；2：数组维数太多；3：数组（矩阵）不匹配；4：内存错误。
math::divl(a,b) |  | 矩阵左除（尚未添加）。
math::divr(a,b) |  | 矩阵右除（尚未添加）。
math::inv(a) |  | 矩阵求逆（尚未添加）。
math::subg | forcal | 返回一个矩阵的子矩阵。
math::subs | forcal | 设置一个矩阵的子矩阵。
math::row(a,b,n) | forcal | 产生一个单行矩阵（行向量）。a和b是行向量的第一个和最后一个元素，元素总数是n。
math::col(a,b,n) | forcal | 产生一个单列矩阵（列向量）。a和b是列向量的第一个和最后一个元素，元素总数是n。
math::rowx(a,b,x) | forcal | 产生一个单行矩阵（行向量）。a是第一个元素，后面的元素按x递增，最后一个元素不超过b。
math::colx(a,b,x) | forcal | 产生一个单列矩阵（列向量）。a是第一个元素，后面的元素按x递增，最后一个元素不超过b。
math::linspace(a,b,n) | forcal | 产生一个一维数组。a和b是数组的第一个和最后一个元素，元素总数是n。
math::linspacex(a,b,x) | forcal | 产生一个一维数组。是第一个元素，后面的元素按x递增，最后一个元素不超过b。
math::zeros(a) math::zeros(i,j) | forcal | 将矩阵a重新初始化为全0矩阵，或者生成一个i×j全0矩阵（在函数oo中返回临时变量，否则返回一般变量）。运行错误：1：数组不存在；2：不是二维数组（矩阵）；3：内存错误；4：参数太多或者太少。
math::ones(a) math::ones(i,j) | forcal | 将矩阵a重新初始化为全1矩阵，或者生成一个i×j全1矩阵（在函数oo中返回临时变量，否则返回一般变量）。运行错误：1：数组不存在；2：不是二维数组（矩阵）；3：内存错误；4：参数太多或者太少。
math::eye(a) math::eye(i,j) | forcal | 将矩阵a重新初始化为单位矩阵，或者生成一个i×j单位矩阵（在函数oo中返回临时变量，否则返回一般变量）。运行错误：1：数组不存在；2：不是二维数组（矩阵）；3：内存错误；4：参数太多或者太少。
math::rand(a) math::rand(i,j) | forcal | 将矩阵a重新初始化为0～1之间均匀分布的随机数矩阵，或者生成一个i×j矩阵（在函数oo中返回临时变量，否则返回一般变量），并用0～1之间均匀分布的随机数初始化。 运行错误：1：数组不存在；2：不是二维数组（矩阵）；3：内存错误；4：参数太多或者太少。
math::randn(a) math::randn(i,j) | forcal | 将矩阵a重新初始化为均值为0，方差为1的标准正态分布的随机数矩阵，或者生成一个i×j矩阵（在函数oo中返回临时变量，否则返回一般变量），并用均值为0，方差为1的标准正态分布的随机数初始化。 运行错误：1：数组不存在；2：不是二维数组（矩阵）；3：内存错误；4：参数太多或者太少。
math::reshape | forcal | 改变数组（矩阵）形状。
解方程函数 |  |
math::netn | forcal | 求非线性方程组一组实根的拟牛顿法。

注：开发者及维护者中，最新的放在最前面。

1 什么是FcMath [返回页首]

FcMath32W.dll是一个Forcal数值计算扩展动态库，该库以线性代数特别是矩阵运算为基础。

在FcMath中的函数是通过二级函数命名空间“math”输出的，所有函数均具有类似“math::array(...)”的格式，都是实数函数。使用!using("math");可简化FcMath中的函数访问。

FcMath32W.dll需要FcData32W.dll的支持。FcData32W.dll要先于FcMath32W.dll加载。

FcMath库的数组是C格式的，元素序号是基于0的。可以使用函数 sys::rearray 在Forcal数组（C数组格式）和Fortran数组之间进行转换。

一般，若FcMath函数返回一个对象，则在oo函数中将返回临时对象，否则返回一般对象；临时对象由oo函数进行管理，一般对象须用函数delete销毁。故若没有特殊的原因，建议在oo函数中使用FcMath函数！若一般对象没有及时用delete销毁，则其将常驻内存，消耗内存资源；可用FcData的函数DelAllFCD()销毁所有对象，释放内存资源，或者在程序退出时自动销毁所有对象。

FcMath库函数具有内存消耗低、执行效率高、代码简洁、实用性强的特点。

FcMath的源代码是开放的，源代码下载：http://www.forcal.net/xiazai/forcal9/forcal9code.rar

FcMath库中所用的算法或许不是最好的，如果您有好的算法，可以方便地进行替换，提升FcMath的性能。

FcMath库可用于开发极致性能的应用程序，是熟悉C/C++、Fortran的数学爱好者的极佳的练手工具，同时也期望对一般的数值计算用户提供越来越多的方便。

限于作者水平，期待与朋友们共同完善FcMath！如果您有什么好的算法，任何改进的意见或建议，请与作者联系。

任何喜欢FcMath的个人、团队或商业公司可基于此库开发商业程序。

2 FcMath数组（矩阵）对象基本用法 [返回页首]

借助Forcal编译器的支持，FcMath中的数值、数组（矩阵）对象有以下简洁的用法。

若A是FcMath数值对象 （该对象是用函数rn申请的）：

A() //返回对象A的值

A.=x //将x赋值给对象A

若A、B是FcMath数组（矩阵）对象：

A.=B //将对象B赋值给对象A

A.=A+B //将对象A+B赋值给对象A，需在函数oo{...}中使用该表达式

A[2]=A[2]+1 //将一维数组A第2个单元的值加1

A[2,3,5]=A[3,1,2]+1 //将三维数组A的第[2,3,5]个单元的值赋值为A[3,1,2]+1

A*rn(2) //数组（矩阵）A的每一个元素乘以2，不能使用 A*2 的形式，必须用函数rn将2转换为一个数值对象

若A是一个FcMath矩阵：

A(type) //返回与矩阵A同样大小的矩阵，并根据type的值进行初始化。type的可选值为zeros（全0矩阵）、ones（全1矩阵）、eye（单位矩阵）、rand（0～1之间均匀分布的随机数）、randn（均值为0，方差为1的标准正态分布的随机数）。

A(neg:j) //取矩阵A第j列所有元素。neg是一个常量，在这里表示取所有行

A(i:neg) //取矩阵A第i行所有元素。neg是一个常量，在这里表示取所有列

A(i,i+m:neg) //取矩阵A第i～i+m行所有元素。neg是一个常量，在这里表示取所有列

A(neg:j,j+m) //取矩阵A第j～j+m列所有元素。neg是一个常量，在这里表示取所有行

A(i,i+m:j,j+n) //取矩阵A第i～i+m行，并在第j～j+n列的所有元素

A(neg:j)=B //设置矩阵A第j列所有元素，B是一个数组。neg是一个常量，在这里表示取所有行

A(i:neg)=B //设置矩阵A第i行所有元素，B是一个数组。neg是一个常量，在这里表示取所有列

A(i,i+m:neg)=B //设置矩阵A第i～i+m行所有元素，B是一个矩阵。neg是一个常量，在这里表示取所有列

A(neg:j,j+m)=B //设置矩阵A第j～j+m列所有元素 ，B是一个矩阵。neg是一个常量，在这里表示取所有行

A(i,i+m:j,j+n)=B //设置矩阵A第i～i+m行，并在第j～j+n列的所有元素 ，B是一个矩阵。

一般情况下，二维数组可看作矩阵，参加矩阵的各种运算，但乘法运算对二维数组和矩阵是有区别的，如下所述：

（1）在oo函数中的运算符的意义取决于对象，例如运算“A*B”，若A、B中有一个是矩阵对象，则执行矩阵乘运算；若A、B都是数组，则执行数组乘运算。

（2）无论A、B是数组或是矩阵对象，函数mmul(a,b)执行矩阵乘运算，而函数amul(a,b)执行数组乘运算。

[例子]

> !using["math","sys"];
> (:t0,k,i,a,b)=
> {
> t0=clock(),
> oo{k=zeros(5,5)}, //生成5×5矩阵k，初始化为0
> i=0,(i<1000).while{ //循环计算1000次
> oo{
> a=rand(5,7), b=rand(7,5), //生成5×7矩阵a，7×5矩阵b，用0～1之间的随机数初始化
> k.=k+a*b+a(0,4:1,5)*b(1,5:0,4)+a(neg:6)*b(3:neg) //计算k=k+a*b+a(0,4:1,5)*b(1,5:0,4)+a(neg:6)*b(3:neg)
> },
> i++
> },
> k.outm(), //输出矩阵k，然后销毁k
> [clock()-t0]/1000 //得到计算时间，秒
> };

5 FcMath函数 [返回页首]

[返回页首][实数函数] math::array(n1, n2, ... ...)：申请数组或矩阵

该函数调用FcData的new函数申请实数数组或矩阵 。n1, n2, ... ...是数组的维数，最多申请16维的数组。二维数组即是一个矩阵。
在函数oo中，该函数返回临时变量，否则返回一般变量。一般变量由脚本程序员进行管理。

[返回页首][实数函数] math::arrayinit(k : n1, n2, ..., nk : x1,x2,... ...)：申请数组或矩阵并初始化

该函数调用FcData的new函数申请实数数组或矩阵。k为数组的总维数；n1, n2, ..., nk是数组各维数的大小；x1,x2,... ...是初始化数据，从地址0开始存放，初始化数据可以少于或多于数组大小，多余的数据被忽略。最多申请16维的数组。二维数组即是一个矩阵。
在函数oo中，该函数返回临时变量，否则返回一般变量。一般变量由脚本程序员进行管理。

[返回页首][实数函数] math::arrayinitns(n1, n2, ..., nk : "1 -2 3 2.3 ... ...")：申请数组或矩阵并初始化

该函数调用FcData的new函数申请实数数组或矩阵。n1, n2, ..., nk是数组的维数。最多申请16维的数组。二维数组即是一个矩阵。
该函数用一个包含数字的Forcal静态字符串对数组进行初始化，从地址0开始存放数据。
在函数oo中，该函数返回临时变量，否则返回一般变量。一般变量由脚本程序员进行管理。

运行错误：1：非法的Forcal静态字符串地址；2：非法的数字字符串。

[返回页首][实数函数] math::outm(a, precision, rl, index)：输出数组或矩阵

a：数组或矩阵，按列表方式输出 。
precision：有效数字位数（1～17），缺省是6位有效数字。
rl：左对齐或右对齐输出，非0表示右对齐。 缺省是右对齐。
index：index非0时输出数组元素下标。缺省是不输出数组元素下标。

运行错误：1：参数太多或者太少；2：数组不存在 ；3：数组维数太多。

[返回页首][实数函数] math::Sum(a,i)：数组元素求和

设有m维数组（含矩阵）：a(n1,n2,... ...,nm)，则Sum(a,i)对第i维求和，返回一个m-1维数组。若a是一维数组、1×k矩阵、k×1矩阵、i<1或者i>m，则Sum函数返回所有数组元素的和。Sum(a)相当于Sum(a,m)。

运行错误：1：参数太多或者太少；2：数组不存在 ；3：数组维数太多；4：内存错误。

[返回页首][实数函数] math::ndgrid(x1,x2,...,xn : &y1,&y2,...,yn)：生成n维函数的辅助格点阵列

x1,x2,...,xn：均是一维数组。
&y1,&y2,...,yn：返回n维函数的辅助格点阵列。
返回值：无意义。

运行错误：1：参数太多或者太少；2：数组不存在；3： 不是一维数组；4：内存错误。

例子：

> !using["math"];
> mvar:
> oo{
> ndgrid[linspacex(0,1,0.0011),linspacex(1,2,0.0009),&x,&y],
> Sum[Cos(rn(1)-Sin(rn(1.2)*x^(y/rn(2))+Cos(rn(1)-Sin(rn(1.2)*y^(x/rn (2)))))),0]
> };

相当于：

> f(x,y)=cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
> sum["f":0,1,0.0011:1,2,0.0009];

[返回页首][实数函数] math::subg(a, ... ...)：返回一个矩阵的子矩阵

subg(a)：返回矩阵a的副本。
subg(a:type)：返回与矩阵a同样大小的矩阵，并根据type的值进行初始化。type的可选值为zeros（全0矩阵）、ones（全1矩阵）、eye（单位矩阵）、rand（0～1之间均匀分布的随机数）、randn（均值为0，方差为1的标准正态分布的随机数）。
subg(a:neg:j)： 取矩阵a第j列所有元素。neg是一个常量，在这里表示取所有行。
subg(a:i:neg)：取矩阵a第i行所有元素。neg是一个常量，在这里表示取所有列。
subg(a:i,i+m:neg)：取矩阵a第i～i+m行所有元素。neg是一个常量，在这里表示取所有列。
subg(a:neg:j,j+m)：取矩阵a第j～j+m列所有元素。neg是一个常量，在这里表示取所有行。
subg(a:i,i+m:j,j+n)：取矩阵a第i～i+m行，并在第j～j+n列的所有元素。
返回值：在函数oo中，该函数返回临时变量，否则返回一般变量。

运行错误：1：参数太多或者太少；2：数组不存在；3：不是二维数组（矩阵）；4：不可识别的类型标识type；5：无法定位矩阵的行或列。

[例子]

> !using["math"];
> (:a)=
> oo{
> a=array[6,5].rand(),
> a.outm(),
> a.subg(neg:3).outm(),
> a.subg(3:neg).outm(),
> a.subg(3,5:2,3).outm()
> };

[返回页首][实数函数] math::subs(a, ... ...,b)：设置一个矩阵的子矩阵

subs(a:b)：将矩阵b赋值给矩阵a，a与b应具有相同的结构。
subs(a:neg:j,b)： 对矩阵a第j列所有元素赋值，b是一个等长的一维数组。neg是一个常量，在这里表示取所有行。
subs(a:i:neg,b)： 对矩阵a第i行所有元素赋值，b是一个等长的一维数组。neg是一个常量，在这里表示取所有列。
subs(a:i,i+m:neg,b)： 对矩阵a第i～i+m行所有元素赋值，b是一个相同大小的矩阵。neg是一个常量，在这里表示取所有列。
subs(a:neg:j,j+m,b)： 对矩阵a第j～j+m列所有元素赋值，b是一个相同大小的矩阵。neg是一个常量，在这里表示取所有行。
subs(a:i,i+m:j,j+n,b)： 对矩阵a第i～i+m行，并在第j～j+n列的所有元素赋值，b是一个相同大小的矩阵。
返回值：返回a。

运行错误：1：参数太多或者太少；2：数组不存在；3：不是二维数组（矩阵）；4： 数组不匹配；5：无法定位矩阵的行或列。

[返回页首][实数函数] math::reshape(a,... ...)：改变数组（矩阵）形状

格式1：math::reshape(a)：将矩阵重置为一维数组。
格式2：math::reshape(a,i,j)：将矩阵a（或一维数组）重置为i×j矩阵，保持总元素不变。
格式3：math::reshape(a,i,j,k,...)：改变多维数组的维数大小，保持维数和总元素不变。

运行错误代码：1：参数太多或者太少；2：实数数组不存在；3：数组维数小于1；4：数组不匹配。

[返回页首][实数函数] math::netn(f,x,eps,t,h,k)：求非线性方程组一组实根的拟牛顿法

f：自定义2n元函数句柄，但必须由二级函数HFor获得该句柄。由用户自编。

> f(x1,x2,...,xn,y1,y2,...,yn)= //xi为自变量，yi为方程右端点函数值
> {
> y1=f1(x1,x2,...,xn),
> y2=f2(x1,x2,...,xn),
> ... ...
> yn=fn(x1,x2,...,xn)
> };

x：双精度实型一维数组，长度不小于n，存放一组初值，返回方程组的一组实根。
eps：控制精度（eps>0）。可缺省该参数，缺省值eps=1e-6。
t：控制h大小的变量，0<t<1。可缺省该参数，缺省值h=0.1。
h：增量初值，在本函数中将被破坏。可缺省该参数，缺省值h=0.1。
k：允许的最大迭代次数。可缺省该参数，缺省值k=100。

返回值：返回值为实际迭代次数。若返回值为-1表示代数方程奇异，若返回值为-2表示β=0，这两种情况可放宽精度要求、改变各个初值或改变各个方程顺序再试；若返回值等于0说明迭代了k次仍未满足精度要求，程序工作失败。

运行错误代码：1：参数太多或者太少；2：指定的表达式不存在；3：方程f参数个数不符合要求；4：实数数组不存在；5：数组元素太少；6：精度、控制变量、迭代次数等不符合要求；7：内存错误。

[例子]

> f(x1,x2,x3,y1,y2,y3)= //函数定义
> {
> y1=x1*x1+x2*x2+x3*x3-1.0,
> y2=2.0*x1*x1+x2*x2-4.0*x3,
> y3=3.0*x1*x1-4.0*x2+x3*x3
> };
> !using["math","sys"];
> (:x,i)=oo{
> x=array(3),
> x.SA[0 : 1,1,1], //设置初值为1,1,1
> i=netn[HFor("f"),x], //拟牛顿法解方程
> x.outm(), //输出结果
> i //返回迭代次数
> };

[返回页首][实数函数] math::

版权所有© Forcal程序设计 2002-2010，保留所有权利
E-mail: forcal@sina.com QQ：630715621
最近更新: 2010年12月13日