模組:Complex Number/doc
此頁面為 Module:Complex Number 的說明文件
此頁面是Module:Complex Number的模組文件。 此頁面可能包含了模板的使用說明、分類和其他內容。 |
此模組文件被引用於約5,100個頁面。 為了避免造成大規模的影響,所有對此模組文件的編輯應先於沙盒或測試樣例上測試。 測試後無誤的版本可以一次性地加入此模組文件中,但是修改前請務必於討論頁發起討論。 模板參照數量會自動更新。 |
本模組為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 的擴充,定義了上方兩個程式庫中的功能
|
簡單的布林代數 | 會運算成<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原生支援 | 邏輯或 | 輸出 | |||
減法a - b
|
lua原生支援 | 輸出 | |||||
乘法a * b
|
lua原生支援 | 邏輯與 | 輸出 | ||||
除法a / b
|
只能除實數 | lua原生支援 | 不存在 | 輸出 | |||
模除a % b
|
以高斯符號定義 | lua原生支援 | 不存在 | ||||
一元運算 | 相反數-a
|
lua原生支援 | 邏輯非 | 輸出 | |||
tostring | lua原生支援 | ||||||
e常數e
|
輸出 | ||||||
圓周率pi
|
lua原生支援 | 輸出 | |||||
虛數單位i
|
輸出 | ||||||
j單位j
|
輸出 | ||||||
k單位k
|
輸出 | ||||||
絕對值abs(a)
|
lua原生支援 | 回傳1或0 | 輸出 | ||||
符號函數sgn(a)
|
回傳1或0 | 輸出 | |||||
共軛複數conjugate(a)
|
原式輸出。 | 輸出 | |||||
輻角arg(a)
|
輸出 | ||||||
平方根sqrt(a)
|
輸出 | ||||||
倒數inverse(a)
|
輸出 | ||||||
分數div(a,b)
|
輸出 | ||||||
數字部件 | 實部re(a)
|
輸出 | |||||
虛部im(a)
|
恆為0 | 輸出 | |||||
非實部nonRealPart(a)
|
恆為0 | 恆為0 | 即將到來 | ||||
純量部 | |||||||
向量部 | |||||||
部件向量tovector(a)
|
單一元素向量 | ||||||
內積dot(a,b)
|
與乘法相同 | 輸出 | |||||
外積outer(a,b)
|
不存在 | 恆為0 | 不存在 | 不存在 | 即將到來 | ||
冪a ^ b
|
只能pow(a,b) | 只能pow(a,b) | lua原生支援 | 只能pow(a,b) | |||
指對數函數 | 指數pow(a,b)
|
lua原生支援 | 輸出 | ||||
自然對數log(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
自然指數exp(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
ciscis(a)
|
不存在 | 輸出 | |||||
高斯符號 | 地板floor(a)
|
lua原生支援 | 不存在 | 輸出 | |||
天花板ceil(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
數值修約round(a)
|
不存在 | 即將到來 | |||||
截尾函數trunc(a,b)
|
不存在 | 輸出 | |||||
三角函數 | 正弦sin(a)
|
lua原生支援 | 不存在 | 輸出 | |||
餘弦cos(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
正切tan(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
餘切cot(a)
|
不存在 | 輸出 | |||||
反三角函數 | 反正弦asin(a)
|
lua原生支援 | 不存在 | 輸出 | |||
反餘弦acos(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
反正切atan(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
反餘切acot(a)
|
不存在 | 輸出 | |||||
雙曲函數 | 雙曲正弦sinh(a)
|
lua原生支援 | 不存在 | 輸出 | |||
雙曲餘弦cosh(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
雙曲正切tanh(a)
|
lua原生支援 | 不存在 | 輸出 | ||||
雙曲餘切coth(a)
|
不存在 | 輸出 | |||||
反雙曲函數 | 雙曲反正弦asinh(a)
|
不存在 | 輸出 | ||||
雙曲反餘弦acosh(a)
|
不存在 | 輸出 | |||||
雙曲反正切atanh(a)
|
不存在 | 輸出 | |||||
雙曲反餘切acoth(a)
|
不存在 | 輸出 |
擴充函數
本模組僅為這些數學結構定義一些基本運算(見上表)。一些較複雜的運算可透過調用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
- 二元複數函數庫
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:求解器和部分共用的函數。