25算术概述这个软件具有非常广泛的算术特性,从JPLOT继承的。本手册(在线帮助系统除外)并未提供这些特性的完整文档,而是概述了通常需要的所有功能。
25.1常规属性没有特殊指示的变量名可以具有实数值。复变量的名称以“%”(例如E%)结尾,而字符串变量则使用“$”符号。
实数可以用通常的指数表示法书写,例如3e-5=3file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif10-5。对于复数,例如3+4*i或3%4。
可用的算术运算符是“+”、“-”、“*”、“/”和“^”, “^”表示“幂”。这些运算符具有通常的层次结构。此外,还有常见的关系运算符<,<=,>=,>,=,和<>。
预定义的常量是i(虚单位)和pi。
25.2复合表达式对于复杂的计算,通常使用复合表达式,由几个项组成,这些项依次进行计算,最终结果由最后一个项确定。语法是
(expr1; expr2; ...; exprN)
或
begin expr1; expr2; ...; exprN; end
其中expr1等是正常数学表达式。例如,
(a := 4; b := B/a; c := -3 * sqrt(C);(-b+sqrt(b^2-4*a*c))/(2*a))
首先为变量a、b和c赋值,然后根据这些值计算最终结果。
在这种复合表达式中,可以使用局部变量:
f(x) :=
begin
globalB, C;
var a,b, c;
a := 4* x;
b := B/ a;
c :=-3 * sqrt(C); (-b + sqrt(b^2 – 4 * a * c)) / (2 * a));
end
其中a、b和c是局部的,在这个意义上,不干扰具有这些名称的任何全局变量。
自版本V5以来,可以(并且应该)声明对全局变量的访问。(此类声明仅在函数定义的begin/end块中需要,并且仅在软件的常规设置要求时才需要。)示例:
g(x) :=
begin
globallast_x;
last_x:= x;
sin(x);
end
使用指令global allow all可以访问某个函数中的所有全局变量(例如,当列出这些变量太不方便时)。
另一种可能是声明局部常量:
E(r) :=
begin
conste = 1.609e-19;
e /r^2;
end
25.3算术函数下表列出了一系列用于算术的标准函数。以下部分将解释一些特殊函数。
正负号函数,当r﹥0为1,当r﹤0为-1,当r=0为0
四舍五入到最近的整数,例如:3.8→4,-3.8→-4
四舍五入到下一个较小的整数,例如:3.8→3,-3.8→-4
r﹥0:等分布随机数0≤x﹤r
r﹤0:标准差为的高斯分布
r=0:根据init_rnd()的参数设置的随机数(见下文)
r﹥0:等分布随机数0≤Re(z)﹤r和0≤Im(z)﹤r
r﹤0:对于实部和虚部标准差为的高斯分布
r=0:根据init_rnd()的参数设置的随机数(见下文)
可以设置生成随机数的种子值。如果参数在整数范围内,则以下随机数由该种子值确定。(这对于生成可再生的随机数序列很有用。)对于一个非常大的参数(例如1E10),种子是随机的,即它是在当前系统时间的影响下产生的。
用rnd(0)初始化随机数的生成:sigma=标准差,tau=相干时间(后续样本的时间间隔),f0=最大光谱功率密度的频率
将模(绝对值)和相位组合为复数r1 * exp(i*r2)
三角函数,类似有:cos, tan, cot, arcsin, arccos, arctan, arccot
双曲函数,类似有:cosh, tanh, coth, arcsinh, arcosh, artanh, arcoth
numdif(...)和
numdif4(...)
如果term定义了则为1,否则为0
例子:defined(sqrt(2)) = 1,
defined(sqrt(-2)) = 0
25.4数组数组可以保存实数、复数或字符串值,可以有多个(最多8个)维度,并且具有非整数索引值。例如
defarray z%[1, 2, 0.5; 0, 10]
定义一个二维复数组,第一个索引以0.5为步长从1到2,第二个索引以1为步长从0到10。当调用某个值时,例如使用z%[1.3,5.8],数组索引将四舍五入为最接近的索引值。括号前的“~”表示线性插值,双“~”表示二次插值,三“~”表示三次样条插值。
除了如上所示的命令defarray之外,还可以使用函数调用def_array(‘z%’,1, 2, 0.5, 0, 10, 1)。(函数调用可以在数学表达式中完成,这样可以提供更多的灵活性。)这里,需要为每个维度指定三个索引值(最小、最大和步长尺寸)。由于参数的数量有限,只能通过这种方式定义最多二维数组。
可以使用各种函数来操作数组:
def_array('a', 0, 1, 1e-3)
定义具有给定名称和索引范围(最小、最大和步长尺寸)的一维数组。使用另外三个索引参数,还可以定义二维数组。(备注:还有一个名为defarray的命令,可以用它定义数组。它适用于最大为8的数组维度,但不能在算术表达式中调用。)
i1(a[]), i2(a[]), 和di(a[])
一维数组的第一个索引、最后一个索引和步长尺寸。对于更高维度的数组,可以使用第二个参数指定维度。
将第一个数组的内容复制到第二个数组中。这也适用于复数组和字符串数组。两个数组的索引范围不需要相同,但数组必须具有相同数量的元素。
processarray(a[], '*', r)
将所有数组元素与值r相乘。第二个参数可以是运算符“+”、“-”、“*”、“/”之一。第三个参数通常是实值,但在复数组的情况下也可能是复数。它也可以是一个表达式,而不是一个常量值,具体取决于数组索引x。
processarrays(a[], a1[], '+', a2[])
将数组a1[]和a2[]逐元素相加,并将结果分配给a[]。第三个参数可以是运算符“+”、“-”、“*”、“/”之一。该函数也适用于复数组和字符串数组,但对于字符串数组,只支持加法。
返回所有数组元素的绝对平方和。数组必须是实数或复数。
计算一维数组的j阶矩,即它将所有元素乘以数组索引的j次幂并求和。对于二维数组,该函数可用于三个索引:moment(b[],j,k)用第一个索引的j次幂和第二个索引的k次幂计算矩。
返回两个实数数组的标量积(点积),即元素的所有乘积之和。
返回两个复数组的标量积(点积),即元素所有积的和。在这里,乘积是由第一个数组元素的复共轭构成的。
findmax(a[])和findmin(a[])
返回具有最大或最小数组值的元素索引。数组必须是一维的。数组类型可以是实数、复数(其中最小值或最大值适用于绝对值)或字符串。
将数组的内容保存到文件中(也可以将索引范围指定为第三个和第四个参数)
从文件加载数组的内容(也可以指定第一个索引和元素数作为第三个和第四个参数)
25.5数值积分数值积分是通过函数int()完成的。默认情况下,此函数使用扩展的Simpson方法,这对于平滑函数是精确的。被积函数在等距点上计算,包括积分区间的两端。例如,
int(f(x), x := a to b, tol = 1e-6)
将数值地计算f(x)的积分,其中积分变量x在a…b范围内,tol是所需(绝对)公差。在结果的变化小于tol之前,对数值近似进行了改进。因此,数值误差通常比tol小很多,但由于通常采用数值方法,因此无法保证。可以使用相对公差rtol代替绝对公差tol。
使用附加选项algorithm = trapezoid,可以使用梯形规则而不是扩展的Simpson方法;这对于非光滑函数更为可靠。
交互式帮助系统包含更多详细信息。
25.6数值微分函数numdif()和numdif4()可用于数值微分。他们的参数是:
待微分的表达
微分变量
变量值
数值步长尺寸
微分阶数(0..4,默认为1)
示例:numdif(sin(x), x, 2, 1e-3)将在x=2处近似d/dx sin(x),使用步长尺寸1e-3,而numdif(sin(x), x, 2,1e-3, 2)近似二阶导数。
选择适当的数值步长是很重要的。对于太大的步长,由于高阶导数的影响,结果变得不准确。对于太小的步长,四舍五入误差变得太大。如果将这些函数应用于精度有限的数值计算函数,则较大的步长可能更好。
函数numdif4()的作用基本相同,但使用的是高阶公式。如果数值步长尺寸较大,它可以在不增加计算时间的情况下产生更精确的结果。对于非常小的步长尺寸,由于它对四舍五入误差更为敏感,因此不推荐使用。
25.7数值寻根一个特殊的情况是用于寻根的函数zero。
语法是:
zero(f(x), x in [a, b], ytol = c, xtol = d)
其中a、b、c、d可以是数或表达式。这将在数值上搜索区间[a,b]中实函数f(x)的零点。(如果f(a) * f(b) > 0,程序将尝试扩展间隔,使其包含一个零,但通常应选择间隔[a,b]使其包含零,并且f(a) * f(b) ≤ 0。)假定函数f是连续的(但不一定是可微的)。迭代用于查找根。当找到一个值x时,我们有|f(x)|≤|ytol|或 |x - x_0|≤|xtol|(x_0是精确的零),迭代就结束了。只需指定xtol或ytol即可。
25.8快速傅立叶变换(FFT)函数 FFT() 执行一维快速傅立叶变换。它有三个参数:
l 第一个参数是输入数组(带空括号),它必须是实数的或复数的,并且必须有许多2次方幂的元素。
l 第二个参数是输出数组(带空括号),它必须是复数的。
l 第三个参数必须是+1或-1,表示转换的方向,+1表示积分的参数包含参数+iωt的指数。
然后,函数计算输入数组的傅立叶变换,并将结果存储在输出数组中。它还设置输出数组的尺寸和正确的索引范围(这样初始数组尺寸和索引范围就不重要)。例如,如果输入数组的索引范围为1到1024,则输出数组的1024个元素的范围为-511/1024到+512/1024,步长为1/1024。(将此转换回,索引范围将是-511到+512。)
例子:
calc FFT(x[], X%[],+1)
25.9控制结构为了区分表达式中的不同情况,可以使用if-then-else结构。例子:
a := if b >= 0 then sqrt(b) else 0
对于迭代,有三种基本上不需要解释的循环类型。例如,以下内容可以是表达式的一部分:
while n > 1 do n := n / 2;
repeat
n :=n / 2;
until n < 1;
for z := 1 to 2 step 0.1 do n := n + 1 / z;
while-do循环和repeat-until循环之间的基本区别是,在后一种情况下,循环体至少执行一次,因为只在结束时检查条件。在for-do循环中,如果结束值低于开始值,则可以将to替换为downto。
交互式帮助包含更多详细信息。
25.10字符串处理函数各种函数可以用于操纵字符串,它包含的各种字符:
字符串s1在s2中的位置。例子:pos('es','Test') = 2
复制字符串中位置p处长度l的一部分;负p值表示从右端开始计数的位置。
s$ 的部分在s1$和s2$之间。例子:between('[',']','Test[abc]-') = 'abc'
replacestr(s$, old$, new$)
实数或复数项t的字符串形式。
一个格式说明符(见下一节)可以附加到参数后面。
字符串参数的实数值,例如 rval('3.5') = 3.5
字符串参数的复数值,例如 rval('3%4') = 3+4i
matches_re(s$, reg$, options$)
检查字符串S$是否与正则表达式reg$匹配。第三个参数是可选的,可以包含一些选项,例如'i' =忽略大小写(将小写字母视为大写字母)或 'n=10' =最多查找10个匹配项。如果正则表达式在括号中包含一个或多个部分,则可选的第四个参数(例如m$[])是存储匹配项的字符串数组。
replace_re(s$, reg$, new$, options$)
根据正则表达式reg$将s$中的结果替换为new$并返回结果。第四个参数是可选的,可以包含一些选项,例如'i' = 忽略大小写(将小写字母视为大写字母)或 'n=3' = 最多替换3个匹配项。
将字符串s$拆分为单个字符串,将其存储在数组p$[]中,使用作为正则表达式reg$给定的分隔符。结果是获得的部分数。
25.11数值和字符串值的格式对于输出到文件或输出区域,通常需要格式化数值,例如限制数字的数量并使用一些单位。例如,您可能希望获得“1.34 Thz”,而不是1.3452989014e12的未格式化值。格式化是通过在表达式末尾附加冒号(":")和一些附加字符来实现的。规则是:
l 可以附加多个格式指令,每个指令以冒号(":")开头。
l 用非零自然数定义字符串的最小总长度;如有字符串长度小于定义的最小总长度,通过插入空格来实现最小总长度。最小总长度数字后面的字母l、c或r表示对正:左、中或右
l 像 :d3 这样的指令指定总数字位数。
l 使用 :e3(示例),最后一个数字表示103,使用 :e-3表示10-3。
l 格式 :f3的结果是小数点后3位。
l 格式 :z3 四舍五入为整数,如果长度小于3位,则前面添加零。
l 默认情况下,小数点后的末尾处的零将被抑制。要更改这,添加:n,例如:d3:n。
l 在双引号之间指定单位(最多20个字符),例如"Hz"。默认情况下,数字和单位之间会写一个空白;可以通过在单位前面写一个反斜杠(“\”)来避免这一点(例如::"\Hz")。如果合适的话,会使用类似k的前缀为“kilo”(103)或m(10-3);如果您更喜欢指数型前缀,请添加 :np(“无前缀”)。如果单位字符串以括号中的前缀开头,程序将使用此前缀(如果数字字符串不会太长)。类似地,括号中的数字指定首选指数。如果单位字符串以“/”或“%”开头,则不使用前缀。
l 格式 :c提供非数值输出:如果给定数字为1,则返回单位字符串的第一个字符。对于2,它是第二个字符等。对于有效范围之外的数字的,返回“?”。
l 格式:w类似于:c,但适用于使用逗号分隔的单词:如果给定数字为2,则返回单位字符串的第二个单词。对于有效范围之外的数字,返回“?”。请注意,单位字符串不能包含超过20个字符。
l 格式 :m提供单位字符串的多个副本。例如,3:m:"*-"结果为"*-*-*-"。
对于字符串表达式,有以下规则:
l 可以添加多个格式指令,每个指令以冒号(":")开头。
l 非零自然数定义了结果字符串的最小总长度;如果需要,可以通过插入空格来实现最小长度。数字后面的字母l、c或r表示对正:左、中或右。
l 格式 :*3 生成字符串的3个副本。(在这种情况下,最小长度(如果指定)适用于整个字符串。)
25.12图形函数在位置z%(包含x和y坐标的复数)处绘制一个标记,类型m$表示矩形("r")、实心圆("O")、三角形("t")、倒三角形("n")、菱形("h")、十字("x")、星形("*")、单像素点("p")或更粗点("P")
用填充颜色fcol填充点p%周围的区域,直至颜色bcol定义的边框。如果bcol为负,则边框定义为没有颜色abs(bcol)的任何颜色。
生成一个EGA颜色值(参数介于0=黑色和15=白色之间)
基于从蓝色到绿色到深红色的标准颜色标尺,返回介于0和1之间的参数的颜色值。
返回大小不超过1的复参数的颜色值。复相位决定颜色(例如,红色代表正实值,绿色代表负实值),大小决定颜色饱和度。
为下列绘图操作设置颜色;例如:setcolor(blue)或
setcolor(rgb(0.6,0.4,0.3))
和 setcolor(rgb(r, g, b))一样
允许更改以下绘图操作的缩放比例。默认情况下,所有x坐标都根据主x轴缩放,所有y坐标都根据第一个y轴缩放。但是,如果使用命令y2:定义了第二个Y轴,则可以使用set_scaling(1, 2)根据该轴缩放所有y值。同样,用set_scaling(2, 1)可以使用第二个x轴,而不是使用主y轴
重新绘制坐标系,例如,在坐标系的某些部分被其他图形元素覆盖之后
将索引为j(0=当前绘制的图表)的图形窗口的图形内容保存到名为fname$的文件中。
将当前显示的图像添加到动画图像(通过调用save_movie()完成)
5.25.13处理文件的函数
将文件复制到另一个文件,如果成功,则返回1,否则返回0
这将打开一个名为n$的文件;文件模式由字符串m$给出,例如, "wt" =写入文本文件,"at " =附加文本文件,"rb " =读取二进制文件。(有关更多选项,请参阅下表。)
返回一个文件句柄,这对于该文件的进一步操作是必需的。
read_file_content(n$, s$)
将文本文件的全部内容读取到字符串s$或文本数组s$[]
write_file_content(n$,s$)
将字符串s$的内容(或数组s$[])写入文本文件(用UTF8编码)
read_directory(dir$,files$[], options$)
将Windows目录的内容读取到字符串数组。如果成功,则结果为1(目录存在),否则为0。可选字符串options$ 可以包含’r’(递归子目录)。
以下是有关文件模式(函数open_file()的第二个参数)的更多说明:
l 编写文本文件时的编码:没有进一步的规范,文本文件是用UTF-8编码编写的,这样就可以存储任何字符而不会丢失数据。但是,可以将ANSI编码与特定的代码页一起使用,例如西欧的代码页1252或日语的代码页932。文件模式可以是"wt,encoding=cp1252" 或"wt,encoding=utf16"。也可以禁止写入字节顺序标记(BOM),例如 "wt,encoding=utf8-noBOM"。另一种可能是使用"wt,encoding=default" 获取Windows系统的默认编码。
l 读取文本文件时编码:还可以指定读取文件时假定的编码,例如 "rt,encoding=cp1252" 或"rt,encoding=utf8"。这里,默认值是自动模式("rt,encoding=auto"):如果文件包含字节顺序标记,则将其视为UTF,否则将假定ANSI代码页1252(西欧)为默认值。
l 对于写入文本文件,函数write_line()使用的换行符序列默认为crlf(回车+换行)。可以更改,例如,使用文件模式"wt,lb=lf"获取Unix样式的格式。
25.14各种其他函数
显示1到8条实数、复数或字符串类型的消息(每行一条);当用户关闭表单时,执行将继续
当前日期和时间,以秒为单位,从2000年1月1日0:00起
产生频率为f(赫兹,即振荡每秒)和持续时间为T(秒)的声音
exec(cmd$, params$, folder$)
执行程序或Windows命令或打开文档(有关详细信息,请参阅下面的内容)
有关函数exec()的更多详细信息:
l 参数通常是可执行文件的文件名(通常具有完整的文件路径)、命令行参数(可选)和执行程序的文件夹(可选)。
l 如果第一个参数是“win”,则第二个参数将解释为Windows命令。示例:exec("win","dir *.pdf >filelist.txt", "D:\")
l 通常,在启动的程序完成之前,执行将继续,而不需要等待。但是,可以通过在第一个参数前面放一个“@”来让执行等待。示例:使用exec("@win","dir *.pdf >filelist.txt", "D:\"),可以确保在继续执行时命令生成的文件存在。不幸的是,对于某些程序,等待不起作用。
l 如果函数成功,则返回1,否则返回0。注意,“成功”是指成功启动一个程序,而不是成功执行。