Lua 化合物摩尔质量计算模块
Lua module for calculating the molar mass of chemical compounds
我一直在使用(或尝试使用,我拥有的大部分模块都是从其他 Wiki 借来的,因为我对 Lua 的理解充其量是有限的)基于 Lua 的模块及其在我的 Wiki 上调用模板(即用 {{#invoke:}}
调用它们的模板)一段时间后,我有一个化合物信息框(我的 Chembox),其中包括用于化合物中存在的每种化学元素的原子数(即化合物 分子式 中使用的那些数字)和化合物的摩尔质量。我在想,因为可以根据分子式计算化合物的摩尔质量,所以可以创建一个 Lua 模块,它可以自动为我执行此操作,而无需我输入摩尔质量我自己进入这些信息框。
所以我的问题基本上是,我该怎么做?
研究
我的背景是数学,所以我觉得最直接的方法是设置两个向量 A 和 B,然后在它们之间进行点积。 A 将包含用户定义的变量,即那些提供给调用模块的模板的变量。例如,假设我们正在谈论乙醇 (C2H6O) 那么模板可能如下所示:
{{Molar mass calculator
|C = 2
|H = 6
|O = 1
}}
。 B 将包含每个元素的平均原子质量,以克/摩尔为单位 (g/mol)。这个向量将由我自己提供(即,由我提供,我有一份在自然界中发现的数量足以提供这些标准原子量的 84 种元素的列表,其中还列出了它们的标准原子量。所以我将在Lua 代码,如果你只是告诉我在哪里将它们添加到代码中。)。
我在 Lua 中查找了点积,看看这是否可行以及如何实现,并找到了这段代码 (http://rosettacode.org/wiki/Dot_product#Lua):
function dotprod(a, b)
local ret = 0
for i = 1, #a do
ret = ret + a[i] * b[i]
end
return ret
end
print(dotprod({1, 3, -5}, {4, -2, 1}))
我相信这就是您要找的:)
用您自己的值填充 "AtomicWeightLookup" table。
程序末尾有一个调用 "Calculate" 函数的示例。
local AtomicWeightLookup = {
C = 12.01,
H = 1.001,
O = 16
}
local function Calculate(Input)
-- Input Example: {C = 2, H = 6, O = 1}
local Result = 0
-- Iterate through Input table
for Element,Quantity in next,Input do
-- If element is not found in table, assume 0 weight.
local AtomicWeight = AtomicWeightLookup[Element] or 0
-- Multiply
Result = Result + Quantity * AtomicWeight
end
return Result
end
-- EXAMPLE
print(Calculate({C = 2, H = 6, O = 1}))
通过向 Wikitech-I 邮件列表 (wikitech-I@lists.sourceforge.net) 发送电子邮件,我收到了答复。 模块:摩尔质量计算器就是要有代码(round函数是为了将最终结果四舍五入到小数点后三位,因为后来我决定我也想要这个功能):
local p = {};
function p.calc(frame)
local atomicWeights = mw.loadData( 'Module:Standard atomic weight' )
local total = 0
for element, quantity in pairs( frame:getParent().args ) do
if quantity ~= "" then
local atomicWeight = atomicWeights[element] or error( 'Element "' .. element .. '" is not known. Please add it to [[Module:Standard atomic weight]] if it\'s not a typo.' )
quantity = tonumber( quantity ) or error( 'Quantity for ' .. element .. ' is not a number.' )
total = total + atomicWeight * quantity
end
end
function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
return round(total,3)
end
return p
模块:标准原子量 有代码:
local M = {}
M['Ag'] = 107.8682 -- Silver (Ag)
M['As'] = 74.921595 -- Arsenic (As)
M['Au'] = 196.966569 -- Gold (Au)
M['B'] = 10.8135 -- Boron (B)
M['Ba'] = 137.327 -- Barium (Ba)
M['Bi'] = 208.9804 -- Bismuth (Bi)
M['Br'] = 79.904 -- Bromine (Br)
M['C'] = 12.0106 -- Carbon (C)
M['Ca'] = 40.078 -- Calcium (Ca)
M['Cl'] = 35.4515 -- Chlorine (Cl)
M['Co'] = 58.933194 -- Cobalt (Co)
M['Cu'] = 63.546 -- Copper (Cu)
M['F'] = 18.998403163 -- Fluorine (F)
M['Fe'] = 55.845 -- Iron (Fe)
M['Ga'] = 69.723 -- Gallium (Ga)
M['H'] = 1.007975 -- Hydrogen (H)
M['Hg'] = 200.592 -- Mercury (Hg)
M['I'] = 126.90447 -- Iodine (I)
M['K'] = 39.0983 -- Potassium (K)
M['Li'] = 6.9675 -- Lithium (Li)
M['Mg'] = 24.3055 -- Magnesium (Mg)
M['Mn'] = 54.938044 -- Manganese (Mn)
M['N'] = 14.006855 -- Nitrogen (N)
M['Na'] = 22.98976928 -- Sodium (Na)
M['Ni'] = 58.6934 -- Nickel (Ni)
M['O'] = 15.9994 -- Oxygen (O)
M['P'] = 30.973761998 -- Phosphorus (P)
M['Pb'] = 207.2 -- Lead (Pb)
M['Pt'] = 195.084 -- Platinum (Pt)
M['S'] = 32.0675 -- Sulfur (S)
M['Se'] = 78.971 -- Selenium (Se)
M['Sr'] = 87.62 -- Strontium (Sr)
M['Tl'] = 204.3835 -- Thallium (Tl)
M['Zn'] = 65.38 -- Zinc (Zn)
return M
和模板:摩尔质量计算器:
{{#invoke:Molar mass calculator|calc}} g/mol
我一直在使用(或尝试使用,我拥有的大部分模块都是从其他 Wiki 借来的,因为我对 Lua 的理解充其量是有限的)基于 Lua 的模块及其在我的 Wiki 上调用模板(即用 {{#invoke:}}
调用它们的模板)一段时间后,我有一个化合物信息框(我的 Chembox),其中包括用于化合物中存在的每种化学元素的原子数(即化合物 分子式 中使用的那些数字)和化合物的摩尔质量。我在想,因为可以根据分子式计算化合物的摩尔质量,所以可以创建一个 Lua 模块,它可以自动为我执行此操作,而无需我输入摩尔质量我自己进入这些信息框。
所以我的问题基本上是,我该怎么做?
研究
我的背景是数学,所以我觉得最直接的方法是设置两个向量 A 和 B,然后在它们之间进行点积。 A 将包含用户定义的变量,即那些提供给调用模块的模板的变量。例如,假设我们正在谈论乙醇 (C2H6O) 那么模板可能如下所示:
{{Molar mass calculator
|C = 2
|H = 6
|O = 1
}}
。 B 将包含每个元素的平均原子质量,以克/摩尔为单位 (g/mol)。这个向量将由我自己提供(即,由我提供,我有一份在自然界中发现的数量足以提供这些标准原子量的 84 种元素的列表,其中还列出了它们的标准原子量。所以我将在Lua 代码,如果你只是告诉我在哪里将它们添加到代码中。)。
我在 Lua 中查找了点积,看看这是否可行以及如何实现,并找到了这段代码 (http://rosettacode.org/wiki/Dot_product#Lua):
function dotprod(a, b)
local ret = 0
for i = 1, #a do
ret = ret + a[i] * b[i]
end
return ret
end
print(dotprod({1, 3, -5}, {4, -2, 1}))
我相信这就是您要找的:)
用您自己的值填充 "AtomicWeightLookup" table。
程序末尾有一个调用 "Calculate" 函数的示例。
local AtomicWeightLookup = {
C = 12.01,
H = 1.001,
O = 16
}
local function Calculate(Input)
-- Input Example: {C = 2, H = 6, O = 1}
local Result = 0
-- Iterate through Input table
for Element,Quantity in next,Input do
-- If element is not found in table, assume 0 weight.
local AtomicWeight = AtomicWeightLookup[Element] or 0
-- Multiply
Result = Result + Quantity * AtomicWeight
end
return Result
end
-- EXAMPLE
print(Calculate({C = 2, H = 6, O = 1}))
通过向 Wikitech-I 邮件列表 (wikitech-I@lists.sourceforge.net) 发送电子邮件,我收到了答复。 模块:摩尔质量计算器就是要有代码(round函数是为了将最终结果四舍五入到小数点后三位,因为后来我决定我也想要这个功能):
local p = {};
function p.calc(frame)
local atomicWeights = mw.loadData( 'Module:Standard atomic weight' )
local total = 0
for element, quantity in pairs( frame:getParent().args ) do
if quantity ~= "" then
local atomicWeight = atomicWeights[element] or error( 'Element "' .. element .. '" is not known. Please add it to [[Module:Standard atomic weight]] if it\'s not a typo.' )
quantity = tonumber( quantity ) or error( 'Quantity for ' .. element .. ' is not a number.' )
total = total + atomicWeight * quantity
end
end
function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
return round(total,3)
end
return p
模块:标准原子量 有代码:
local M = {}
M['Ag'] = 107.8682 -- Silver (Ag)
M['As'] = 74.921595 -- Arsenic (As)
M['Au'] = 196.966569 -- Gold (Au)
M['B'] = 10.8135 -- Boron (B)
M['Ba'] = 137.327 -- Barium (Ba)
M['Bi'] = 208.9804 -- Bismuth (Bi)
M['Br'] = 79.904 -- Bromine (Br)
M['C'] = 12.0106 -- Carbon (C)
M['Ca'] = 40.078 -- Calcium (Ca)
M['Cl'] = 35.4515 -- Chlorine (Cl)
M['Co'] = 58.933194 -- Cobalt (Co)
M['Cu'] = 63.546 -- Copper (Cu)
M['F'] = 18.998403163 -- Fluorine (F)
M['Fe'] = 55.845 -- Iron (Fe)
M['Ga'] = 69.723 -- Gallium (Ga)
M['H'] = 1.007975 -- Hydrogen (H)
M['Hg'] = 200.592 -- Mercury (Hg)
M['I'] = 126.90447 -- Iodine (I)
M['K'] = 39.0983 -- Potassium (K)
M['Li'] = 6.9675 -- Lithium (Li)
M['Mg'] = 24.3055 -- Magnesium (Mg)
M['Mn'] = 54.938044 -- Manganese (Mn)
M['N'] = 14.006855 -- Nitrogen (N)
M['Na'] = 22.98976928 -- Sodium (Na)
M['Ni'] = 58.6934 -- Nickel (Ni)
M['O'] = 15.9994 -- Oxygen (O)
M['P'] = 30.973761998 -- Phosphorus (P)
M['Pb'] = 207.2 -- Lead (Pb)
M['Pt'] = 195.084 -- Platinum (Pt)
M['S'] = 32.0675 -- Sulfur (S)
M['Se'] = 78.971 -- Selenium (Se)
M['Sr'] = 87.62 -- Strontium (Sr)
M['Tl'] = 204.3835 -- Thallium (Tl)
M['Zn'] = 65.38 -- Zinc (Zn)
return M
和模板:摩尔质量计算器:
{{#invoke:Molar mass calculator|calc}} g/mol