Lua模块用于计算化合物的摩尔质量

时间:2015-03-31 19:38:54

标签: math lua mediawiki

我一直在使用(或尝试使用我从其他Wiki中借用的大多数模块,因为我对Lua的理解最多是有限的)基于Lua的模块及其调用模板(即调用它们的模板)我的Wiki上有{{#invoke:}})一段时间,我有化学化合物的信息框(我的 Chembox ),其中包含化合物中每种化学元素原子数的输入(即,化合物的分子式中使用的那些数字和化合物的摩尔质量。我在想,因为有可能根据其分子式计算化合物的摩尔质量,有可能创建一个Lua模块,可以自动为我做这个,消除了我自己输入摩尔质量的需要。这些信息框。

所以我的问题基本上是,我该怎么做?

研究

我的背景是数学,所以我觉得最直接的方法是设置两个向量A和B,并在它们之间执行点积。 A将包含用户定义的变量,即提供给调用模块的模板的变量。例如,假设我们谈论的是乙醇(C 2 H 6 O),那么模板可能看起来像:

{{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}))

2 个答案:

答案 0 :(得分:1)

我相信这就是你要找的东西:)

填充" AtomicWeightLookup"表格与您自己的价值观。

有一个示例调用"计算"程序结束时的功能。

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}))

答案 1 :(得分:0)

通过电子邮件发送Wikitech-I邮件列表(wikitech-I@lists.sourceforge.net),我收到了答复。 模块:摩尔质量计算器是要有代码(圆函数用于将最终结果四舍五入到最接近的三位小数,因为我后来决定我也想要这个功能):

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