• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            Evaluate Math Expression

            Posted on 2013-10-09 23:38 eryar 閱讀(4685) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE 、4.AVEVA Solution

            Evaluate Math Expression

            eryar@163.com

            摘要Abstract:本文簡(jiǎn)要介紹了數(shù)學(xué)表達(dá)式解析求值的幾款開源軟件,并結(jié)合程序代碼說(shuō)明了OpenCascade中表達(dá)式包的用法。也簡(jiǎn)要介紹了表達(dá)式解析求值在AVEVA Paragon模塊中的應(yīng)用。

            關(guān)鍵字Key Words:Expression, Paragon, OpenCascade Expr package, muParser, MTParser

            一、引言 Introduction

            算術(shù)表達(dá)式中最常見的表示法形式有中綴、前綴和后綴表示法。中綴表示法(Infix notation)是書寫表達(dá)式的常見方式,而前綴(prefix notation)、后綴表示法(postfix notation)主要用于計(jì)算機(jī)科學(xué)領(lǐng)域。算術(shù)表達(dá)式只包含操作數(shù)(operands)、二元操作符(binary operators)和一種括號(hào)(one kind of parentheses)。

            Knuth將編寫程序計(jì)算表達(dá)式的方法概括為三個(gè)步驟:

            l 對(duì)中綴表達(dá)式進(jìn)行語(yǔ)法分析;

            l 中綴表達(dá)式到后綴表達(dá)式的轉(zhuǎn)換;

            l 對(duì)后綴表達(dá)式求值;

            在《數(shù)據(jù)結(jié)構(gòu)與算法》等相關(guān)的書籍中,還有如何將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式的具體算法。

            在AVEAV Plant(PDMS)的Paragon模塊定義部件時(shí),使用了參數(shù)化的表達(dá)式,從而實(shí)現(xiàn)了參數(shù)化的部件定義。其中參數(shù)化表達(dá)式的解析計(jì)算是其一個(gè)關(guān)鍵技術(shù)點(diǎn)。最近在寫模型導(dǎo)出程序(Model Data Exchange Addin)時(shí)就遇到了這個(gè)問題,即參數(shù)化表達(dá)式的計(jì)算。好在AVEVA .Net給出了表達(dá)式計(jì)算類DbExpression,可以對(duì)PML的表達(dá)式進(jìn)行解析計(jì)算,順利解決了問題。

            若想在自己的程序中實(shí)現(xiàn)數(shù)學(xué)表達(dá)式的解析求值,也有一些開源的工具可供選用。有些C++的數(shù)學(xué)表達(dá)式計(jì)算程序速度、效率還是很高的。在查看OpenCascade的文檔時(shí),發(fā)現(xiàn)其也有表達(dá)式求值的包,可用來(lái)對(duì)表達(dá)式進(jìn)行計(jì)算。

            發(fā)現(xiàn)OpenCascade已經(jīng)有很多功能與AVEVA產(chǎn)品PDMS中的功能很類似,也難怪OpenCascade的前身Matra-Data Vision公司早期也有個(gè)集機(jī)械設(shè)計(jì)與工廠設(shè)計(jì)于一身的企業(yè)級(jí)并行工程解決方案Euclid集成系統(tǒng)。在1998年時(shí)Dassault Systèmes收購(gòu)了EUCLID QUANTUM。

            二、幾款開源軟件介紹 Introduce some tools

            網(wǎng)上有很多開源的數(shù)學(xué)表達(dá)式解析求值的庫(kù),如:

            l fparser

            l muParser

            l MTParse

            在開源的二維CAD軟件LibreCAD中就使用了muParser來(lái)對(duì)輸入命令中的表達(dá)式進(jìn)行解析。早期版本中使用了fparser。muParser小巧精干,提供LIB、DLL及源代碼入方式。muParser最大的優(yōu)點(diǎn)就是速度較快,更適合于實(shí)時(shí)性要求較高的環(huán)境,如Unix系統(tǒng)和單片機(jī)環(huán)境。源程序下載及文檔說(shuō)明可參考:

            http://www.codeproject.com/cpp/FastMathParser.asp

            MTParser優(yōu)雅簡(jiǎn)潔,提供LIB、COM、源代碼三種引入方式,是用典型C++風(fēng)格編寫的解析器,和muParser不同,它引入了多種設(shè)計(jì)模式,因而可擴(kuò)展性的可維護(hù)性都很強(qiáng)。如作者所說(shuō),速度并不是TMParser最優(yōu)先考慮的,也許文中所說(shuō)的可擴(kuò)展、可維護(hù)、易于使用、健壯性才是它的最大優(yōu)勢(shì)。源程序下載及設(shè)計(jì)文檔可參考:

            http://www.codeproject.com/Articles/7335/An-extensible-math-expression-parser-with-plug-ins

            下面以一個(gè)具體實(shí)例來(lái)說(shuō)明muParser的用法:(將muParser以源代碼引入的方式加入到項(xiàng)目中),再編譯如下代碼:

             

             1 /*
             2 *    Copyright (c) 2013 eryar All Rights Reserved.
             3 *
             4 *        File    : Main.cpp
             5 *        Author  : eryar@163.com
             6 *        Date    : 2013-10-09
             7 *        Version : 1.0v
             8 *
             9 *    Description : Evaluate expression in muParser.
            10 *                  
            11 */
            12 
            13 #include <iostream>
            14 
            15 #include "muParser.h"
            16 
            17 int main()
            18 {
            19     mu::Parser parser;
            20     parser.DefineNameChars("0123456789_"
            21                        "abcdefghijklmnopqrstuvwxyz"
            22                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            23                        "[]");
            24 
            25     double dParam1 = 2.0;
            26     double dParam2 = 3.1415926 / 2.0;
            27 
            28     parser.DefineVar("PARA[1]"&dParam1);
            29     parser.DefineVar("PARA[2]"&dParam2);
            30 
            31     parser.SetExpr("10 * (PARA[1] + sin(PARA[2]))");
            32 
            33     std::cout << parser.Eval() << std::endl;
            34 
            35 }

            程序運(yùn)行結(jié)果如下所示:

            1 30 
            2 Press any key to continue . . . 

            如上程序所示,使用muParser可實(shí)現(xiàn)參數(shù)化表達(dá)式的計(jì)算,功能與AVEVA Plant(PDMS)中的Paragon模塊中參數(shù)化表達(dá)式的計(jì)算方式已經(jīng)很相近了。使用方法很簡(jiǎn)單。

            三、Evaluate Expression in OpenCascade

            在OpenCascade的TKAdvTools中有Expr包和ExprIntrp包,這兩個(gè)包可用來(lái)對(duì)表達(dá)式進(jìn)行解析和求值。但是在其文檔《Foundation Classes User’s Guide》中并沒有對(duì)TKAdvTools的工具進(jìn)行說(shuō)明。下面只給出一個(gè)簡(jiǎn)單實(shí)例來(lái)說(shuō)明其應(yīng)用,有興趣的讀者可以結(jié)合源程序?qū)ζ渚唧w實(shí)現(xiàn)進(jìn)行研究。示例代碼如下所示:

             

             1 /*
             2 *    Copyright (c) 2013 eryar All Rights Reserved.
             3 *
             4 *        File    : Main.cpp
             5 *        Author  : eryar@163.com
             6 *        Date    : 2013-10-09
             7 *        Version : 1.0v
             8 *
             9 *    Description : Evaluate expression in OpenCascade.
            10 *                  
            11 */
            12 
            13 #define WNT
            14 #include <TCollection_AsciiString.hxx>
            15 #include <Expr_GeneralExpression.hxx>
            16 #include <ExprIntrp_GenExp.hxx>
            17 
            18 #pragma comment(lib, "TKernel.lib")
            19 #pragma comment(lib, "TKAdvTools.lib")
            20 
            21 int main(void)
            22 {
            23     TCollection_AsciiString strExpr("sin(3.1415926 / 6) * 2");
            24     Handle_ExprIntrp_GenExp exprIntrp = ExprIntrp_GenExp::Create();
            25     Handle_Expr_GeneralExpression genExpr = NULL;
            26 
            27     exprIntrp->Process(strExpr);
            28 
            29     genExpr = exprIntrp->Expression();
            30 
            31     std::cout << genExpr->EvaluateNumeric() << std::endl;
            32 
            33     return 0;
            34 }

            程序運(yùn)行結(jié)果如下所示:

            1 1 
            2 Press any key to continue . . . 

            OpenCascade的表達(dá)式求值功能也很強(qiáng)大,這里只以一個(gè)簡(jiǎn)單示例來(lái)拋磚引玉啦。感覺OpenCascade的表達(dá)式包也可以像muParser, MTParser一樣作為一個(gè)獨(dú)立的工具來(lái)使用。

            四、結(jié)論 Conclusion

            因?yàn)锳VEVA Plant(PDMS)的Paragon模塊中的參數(shù)化部件定義方式,注意到了參數(shù)表達(dá)式的解析與求值。由于ModelDataExchangeAddin程序的需要,才去找尋開源的表達(dá)式解析與求值的庫(kù),誰(shuí)知最后還是使用了AVEVA .Net中現(xiàn)成的DbExpression類,簡(jiǎn)化了程序的開發(fā)。

            OpenCascade中竟然也有表達(dá)式解析與求值的工具,作為早期機(jī)械設(shè)計(jì)與工廠設(shè)計(jì)軟件系統(tǒng),可能都考慮過參數(shù)化這種方式。深入挖掘其源代碼,對(duì)類似PDMS的工廠設(shè)計(jì)系統(tǒng)實(shí)現(xiàn)原理的理解有很大幫助。

            五、參考資料 Bibliography

            1. http://www.ibm.com/developerworks/cn/java/j-w3eva/

            2. http://en.wikipedia.org/wiki/Euclid_(computer_program)

             

            久久99国产精品尤物| 欧美久久综合九色综合| 亚洲精品国产自在久久| 国产一区二区精品久久岳| 久久天天躁狠狠躁夜夜96流白浆 | 无码精品久久久天天影视| 亚洲七七久久精品中文国产| 国产毛片久久久久久国产毛片| 久久久无码人妻精品无码| 丁香色欲久久久久久综合网| 日韩十八禁一区二区久久 | 精品久久久无码21p发布| 无码8090精品久久一区| 亚洲伊人久久成综合人影院| 亚洲午夜无码AV毛片久久| 久久精品免费全国观看国产| 色综合久久天天综线观看| 女人高潮久久久叫人喷水| 久久久午夜精品| 久久久久久久波多野结衣高潮 | 久久人人爽人人爽人人AV| 99久久无色码中文字幕人妻| 精品国产乱码久久久久久人妻| 亚洲人成电影网站久久| 无码AV中文字幕久久专区| 久久成人影院精品777| 久久精品成人影院| 香蕉99久久国产综合精品宅男自 | 亚洲午夜久久久影院伊人| 久久国产色AV免费看| 亚洲午夜久久影院| 久久久久无码精品| 777午夜精品久久av蜜臀| 久久99精品久久久久久动态图 | 久久亚洲AV成人无码国产| 99久久精品费精品国产| 久久国产精品无码网站| 四虎久久影院| 久久人人爽人人爽人人AV东京热 | 久久精品国产亚洲5555| 久久无码中文字幕东京热|