模块:Complex Number/doc
这是Module:Complex Number的文档页面
| File:Edit-copy green.svg | 此页面是Module:Complex Number的模块文档。 此页面可能包含了模板的使用说明、分类和其他内容。 |
| 警告 | 此模块文档被引用于约5,300个页面。 为了避免造成大规模的影响,所有对此模块文档的编辑应先于沙盒或测试样例上测试。 测试后无误的版本可以一次性地加入此模块文档中,但是修改前请务必于讨论页发起讨论。 模板引用数量会自动更新。 |
本模块为Lua定义了一套复数(如虚数、四元数)运算的系统,可提供其他模块调用使用,而若要直接在模板或条目中使用可通过Module:Complex Number/Calculate或{{复变运算}}来完成。
关于本模块创建动机详见Module:TemplateParameters#设计缘由(亦可参考Template_talk:Root)。
模块内容[编辑]
本模块有4套数学数据结构的定义以及对应的数学运算库:
使用方法[编辑]
- 初始化数学库
local 自定义函数库名称 = require("Module:Complex Number").函数库名称.init()- 例如:
local cmath = require("Module:Complex Number").cmath.init()
- 例如:
- 初始化指定数学结构的数字
local 变量名称 = 自定义函数库名称.constructor("描述数字的字符串")- 例如:
local num1 = cmath.constructor("2+3i")
- 例如:
- 执行运算
- 例如:
local num1 = cmath.constructor("2+3i") local num2 = cmath.constructor("4+5i") print(num1 * num2)
- 输出:-7+22i
- 或者使用函数库内容:
local num1 = cmath.constructor("i") print(cmath.sqrt(num1))
- 输出:0.70710678118655+0.70710678118655i
- 例如:
- 若需要在模板中使用,请参阅{{复变运算}}
原理[编辑]
复数可分为实部和虚部,此特性可以通过Lua的table功能({real=..., imag=...,})来实现,同时通过复写Metatables来完成其各运算符(如+、-、*、/)来实现复变的基本运算:
p.ComplexNumberMeta = {
__add = function (op1, op2)
return p.ComplexNumber(op1.real + op2.real, imag = op1.imag + op2.imag)
end,
--...
}
function p.ComplexNumber(real, imag)
local complexNumber = {real = op1.real + op2.real, imag = op1.imag + op2.imag}
setmetatable(complexNumber,p.ComplexNumberMeta)
return complexNumber
end
如此一来,只要是设定过Metatables的含实部和虚部的table都可以直接进行复变量的运算。
剩下的部分就是完善数学函数库math.xxx的各函数。
比较[编辑]
| 函数库 | 默认的math
|
.cmath
|
.qmath
|
.math
|
.bmath
|
.tagmath位于Module:Complex Number/Calculate | |
|---|---|---|---|---|---|---|---|
| 说明 | Lua默认提供的math程序库 | 复数(<math>a+bi</math>)专用程序库 | 四元数(<math>a+bi+cj+dk</math>)专用程序库 | 默认math的扩展,定义了上方两个程序库中的功能
|
简单的布尔代数 | 会运算成<math></math>的程序库
| |
| 函数库初始化方式 | 无须初始化 | cmath = require("Module:Complex Number").cmath.init();
|
qmath = require("Module:Complex Number").qmath.init();
|
math = require("Module:Complex Number").math.init();
|
bmath = require("Module:Complex Number").bmath.init();
|
tagmath = require("Module:Complex Number/Calculate").tagmath.init();
| |
| 数字建构/初始化方式 | tonumber("10");10
|
cmath.toComplexNumber("1+i");cmath.getComplexNumber(1,1);
|
qmath.toQuaternionNumber("i+j+k");qmath.getQuaternionNumber(0,1,1,1);
|
tonumber("10");10
|
bmath.toBoolean("yes");
|
tagmath.toTagMath("a");
| |
| 四则运算 | 加法a + b
|
是 | 是 | 是 | lua原生支持 | 逻辑或 | 输出<math>a+b</math> |
减法a - b
|
是 | 是 | 是 | lua原生支持 | 是 | 输出<math>a-b</math> | |
乘法a * b
|
是 | 是 | 是 | lua原生支持 | 逻辑与 | 输出<math>a\times b</math> | |
除法a / b
|
是 | 是 | 只能除实数 | lua原生支持 | 不存在 | 输出<math>a\div b</math> | |
模除a % b
|
是 | 是 | 以高斯符号定义 | lua原生支持 | 不存在 | 否 | |
| 一元运算 | 相反数-a
|
是 | 是 | 是 | lua原生支持 | 逻辑非 | 输出<math>-a</math> |
| tostring | 是 | 是 | 是 | lua原生支持 | 是 | 是 | |
e常量e
|
否 | 是 | 是 | 是 | 否 | 输出<math>e</math> | |
圆周率pi
|
是 | 是 | 是 | lua原生支持 | 否 | 输出<math>\pi</math> | |
虚数单位i
|
否 | 是 | 是 | 是 | 否 | 输出<math>i</math> | |
j单位j
|
否 | 否 | 是 | 否 | 否 | 输出<math>j</math> | |
k单位k
|
否 | 否 | 是 | 否 | 否 | 输出<math>k</math> | |
绝对值abs(a)
|
是 | 是 | 是 | lua原生支持 | 回传1或0 | 输出<math>\left\vert a\right\vert</math> | |
符号函数sgn(a)
|
否 | 是 | 是 | 是 | 回传1或0 | 输出<math>\sgn a</math> | |
共轭复数conjugate(a)
|
否 | 是 | 是 | 原式输出。 | 否 | 输出<math>\overline{ a }</math> | |
辐角arg(a)
|
否 | 是 | 是 | 是 | 否 | 输出<math>\arg a</math> | |
平方根sqrt(a)
|
否 | 是 | 是 | 是 | 否 | 输出<math>\sqrt {a}</math> | |
倒数inverse(a)
|
否 | 是 | 是 | 是 | 否 | 输出<math>{a}^{-1}</math> | |
分数div(a,b)
|
否 | 是 | 是 | 是 | 否 | 输出<math>\frac {a}{b}</math> | |
| 数字部件 | 实部re(a)
|
否 | 是 | 是 | 是 | 否 | 输出<math>\operatorname{Re}{a}</math> |
虚部im(a)
|
否 | 是 | 是 | 恒为0 | 否 | 输出<math>\operatorname{Im}{a}</math> | |
非实部nonRealPart(a)
|
否 | 是 | 是 | 恒为0 | 恒为0 | 即将到来 | |
| 标量部 | 否 | 否 | 是 | 否 | 否 | 否 | |
| 向量部 | 否 | 否 | 是 | 否 | 否 | 否 | |
部件向量tovector(a)
|
否 | 是 | 是 | 单一元素向量 | 否 | 否 | |
内积dot(a,b)
|
否 | 是 | 是 | 与乘法相同 | 否 | 输出<math>a\cdot b</math> | |
外积outer(a,b)
|
不存在 | 恒为0 | 是 | 不存在 | 不存在 | 即将到来 | |
幂a ^ b
|
是 | 只能pow(a,b) | 只能pow(a,b) | lua原生支持 | 否 | 只能pow(a,b) | |
| 指对数函数 | 指数pow(a,b)
|
是 | 是 | 是 | lua原生支持 | 否 | 输出<math>a^b</math> |
自然对数log(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\ln a</math> | |
自然指数exp(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\exp a</math> | |
ciscis(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\operatorname{cis} a</math> | |
| 高斯符号 | 地板floor(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\lfloor a \rfloor</math> |
天花板ceil(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\lceil a \rceil</math> | |
数值修约round(a)
|
否 | 是 | 是 | 是 | 不存在 | 即将到来 | |
截尾函数trunc(a,b)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\mathrm{trunc}(a,b)</math> | |
| 三角函数 | 正弦sin(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\sin a</math> |
余弦cos(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\cos a</math> | |
正切tan(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\tan a</math> | |
余切cot(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\cot a</math> | |
| 反三角函数 | 反正弦asin(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\arcsin a</math> |
反余弦acos(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\arccos a</math> | |
反正切atan(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\arctan a</math> | |
反余切acot(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\arccot a</math> | |
| 双曲函数 | 双曲正弦sinh(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\sinh a</math> |
双曲余弦cosh(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\cosh a</math> | |
双曲正切tanh(a)
|
是 | 是 | 是 | lua原生支持 | 不存在 | 输出<math>\tanh a</math> | |
双曲余切coth(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\coth a</math> | |
| 反双曲函数 | 双曲反正弦asinh(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\operatorname{arcsinh} a</math> |
双曲反余弦acosh(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\operatorname{arccosh} a</math> | |
双曲反正切atanh(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\operatorname{arctanh} a</math> | |
双曲反余切acoth(a)
|
否 | 是 | 是 | 是 | 不存在 | 输出<math>\operatorname{arccoth} a</math> | |
扩展函数[编辑]
本模块仅为这些数学结构定义一些基本运算(见上表)。一些较复杂的运算可通过调用Module:Complex_Number/Functions来完成。本模块提供的3个部分(cmath、qmath、math)皆支持Module:Complex_Number/Functions。
- 使用方法
-
mathlib = require("Module:Complex Number/Functions")._init(mathlib, numberConstructer)
- 其中,
mathlib为已初始化的数学函数库(如cmath、qmath、math),numberConstructer为对应该数学函数库数字结构的构造函数函数。 - 所回传的新mathlib将会包含Module:Complex_Number/Functions中已定义的所有扩展函数。
- 注:详细使用条件参见Module:Complex_Number/Functions/doc#使用条件,说明了函数库须具备那些条件方能使用此扩展。
定义新的数学库[编辑]
Module:Complex Number是一系列数学运算库,并可以相互兼容。当然也能定义其他兼容的程序库,但需要符合特定条件,例如需要实现一些需求函数。详细内容可以参考示例数学库Module:Complex Number/Example。
若要定义一个新的Module:Complex Number系列函数库需要实现一个新的对象,并实现其Metatables中的运算符。
定义数学数据结构
数学数据结构需要定义成一个table,并以table来定义或表达所需要的数字。即使数字只有单一对象,也许使用table因为这样才能通过实现Metatables来完成Module:Complex Number系列函数库所需的相关功能。
- numberType:本数学数据结构的类型名称(字符串),用于Module:Complex Number系列函数库的识别(参阅Example的第92行)
- update():更新结构数值的成员函数(参阅Example的第89行)
- clean():去除过小值或误差值的成员函数,并返回结果。若无此需求,直接返回自身即可。(参阅Example的第90行)
实现metatable
需定义Metatables的 __add(加法)、 __sub(减法)、 __mul(乘法)、 __div(除法)、 __mod(取余数)、 __unm(相反数)、 __eq(相等判断)、 __tostring(以字符串表达本对象)
定义数学数据结构的构造函数
由于数学数据结构需要定义为table因此需要有构造函数来赋予该结构初值。构造函数需要完成以下步骤:
- 读取输入的对象或字符串将其存入table对象中(参阅Example的第91行)
- 设定table的metatable为刚才定义的metatable(参阅Example的第88行)
- 定义其他所需的成员变量或函数
定义数学库的初始化函数
数学库必须是一个独立对象,所有的函数皆需定义在数学函数库对象下(包括数学数据结构的构造函数)。初始化数学库的函数名称必为init,当中需要定义以下内容:
- 各项常量的定义(参阅Example的第102行)
- numberType成员函数定义为Module:Complex Number中的_numberType(参阅Example的第106行)
- constructor成员函数设定为数学结构的构造函数(参阅Example的第107行)
- elements成员变量设定为单位元的清单(参阅Example的第108行)
完成数学库的定义
视情况定义列于Module:Complex_Number/doc#比较中的各项函数(如需支持Module:Complex_Number/Functions的情况)。
其他函数库[编辑]
require("Module:Complex Number").cmath- 复变函数库
require("Module:Complex Number").qmath- 四元数函数库
require("Module:Complex Number").math- 实数函数库扩展
require("Module:Complex Number").bmath- 布尔代数函数库
require("Module:Complex Number/Calculate").tagmath- 输出为
<math></math>的运算库 require("Module:Complex Number/Matrix").mmath- 矩阵函数库
require("Module:Complex Number/Dual Number").dumath- 二元数函数库
require("Module:Complex Number/Dual Number").ducmath- Module:WikidataLink第216行Lua错误:attempt to index field 'wikibase' (a nil value)函数库
require("Module:Complex Number/Octonion").omath- 八元数函数库
require("Module:Complex Number/CayleyDickson").cdmath.init(math_lib)- 将指定的函数库
math_lib套用凯莱-迪克森结构形成新的函数库(无法自我嵌套) require("Module:Complex Number/CayleyDickson").sdmath- 八元数套用凯莱-迪克森结构后的形成新的十六元数函数库
require("Module:Complex Number/CayleyDickson").cdmathOctonion- 预先套用凯莱-迪克森结构的八元数后的函数库(可作为十六元数使用)
require("Module:Complex Number/CayleyDickson").cdmathSedenion- 预先套用凯莱-迪克森结构的十六元数后的函数库(可作为三十二元数使用)
相关页面[编辑]
- Module:Complex_Number/Solver:求解器和部分共享的函数。