此頁面為 Module:Complex Number 的說明文件

本模組為Lua定義了一套複數(如虛數四元數)運算的系統,可提供其他模組呼叫使用,而若要直接在模板或條目中使用可透過Module:Complex Number/Calculate‎或{{複變運算}}來完成。

關於本模組建立動機詳見Module:TemplateParameters#設計緣由(亦可參考Template_talk:Root)。

模組內容

編輯

本模組有4套數學資料結構的定義以及對應的數學運算庫:

.cmath
複數的數學資料結構及運算的系統
.qmath
四元數的數學資料結構及運算的系統
.math
實數運算系統的擴充
.bmath
布林代數的數學資料結構及運算的系統

使用方法

編輯
  1. 初始化數學庫
    • local 自訂函數庫名稱 = require("Module:Complex Number").函數庫名稱.init()
      例如:local cmath = require("Module:Complex Number").cmath.init()
  2. 初始化指定數學結構的數字
    • local 變數名稱 = 自訂函數庫名稱.constructor("描述數字的字串")
      例如:local num1 = cmath.constructor("2+3i")
  3. 執行運算
    例如:
    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原生支援 不存在 輸出 
cis
cis(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中的運算子。

定義數學資料結構

參閱Example的第85行

數學資料結構需要定義成一個table,並以table來定義或表達所需要的數字。即使數字只有單一物件,也許使用table因為這樣才能透過實作Metatables來完成Module:Complex Number系列函數庫所需的相關功能。

實作metatable

參閱Example的第47行

需定義Metatables的 __add(加法)、 __sub(減法)、 __mul(乘法)、 __div(除法)、 __mod(取餘數)、 __unm(相反數)、 __eq(相等判斷)、 __tostring(以字串表達本物件)

定義數學資料結構的建構子

參閱Example的第85行第95行

由於數學資料結構需要定義為table因此需要有建構子來賦予該結構初值。建構子需要完成以下步驟:

定義數學庫的初始化函數

參閱Example的第101行

數學庫必須是一個獨立物件,所有的函數皆需定義在數學函數庫物件下(包括數學資料結構的建構子)。初始化數學庫的函數名稱必為init,當中需要定義以下內容:

完成數學庫的定義

視情況定義列於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
二元複數英語Applications of dual quaternions to 2D geometry函數庫
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
預先套用凱萊-迪克森結構十六元數後的函數庫(可作為三十二元數使用)

相關頁面

編輯