没有合适的资源?快使用搜索试试~ 我知道了~
Mr.CAS: 一个极简的用于快速原型和代码生成的纯RubyCAS
≥SoftwareX 6(2017)128原始软件出版物Mr.CAS-一个极简的(纯)RubyCAS,用于快速原型和代码生成马特奥·拉格尼Department of Industrial Engineering,University of Trento,9,Sommarive,Povo di Trento,Italyar t i cl e i nf o文章历史记录:2017年1月31日收到2017年5月9日收到修订版,2017年保留字:CAS代码生成Rubya b st ra ct市场上有计算机代数系统(CAS)系统,具有用于操作分析模型的完整解决方案但是,为目标语言或特定的数值库导出在特定平台上实现特定算法的模型这项工作提出了一个Ruby库,公开了核心CAS功能,即。简化、替代、评估等。该库针对需要快速原型化并为不同目标语言生成数字代码的程序员,同时将数学表达式与代码生成规则分开该库是用纯Ruby语言编写的,与大多数Ruby解释器兼容©2017作者由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本0.2.7用于此代码版本的代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX-D-17-00013rubygems.org/gems/Mr.CAS法律代码许可证MIT使用git的代码版本控制系统(GitHub)软件代码语言、工具和服务使用Ruby语言编译要求、操作环境Ruby二、X如果可用,链接到开发人员文档/手册rubydoc.info/gems/Mr.CAS问题支持电子邮件info@ragni.me1. 动机和意义Ruby[1]是由Yukihiro Matsumoto于20世纪90年代中期设计的纯 面 向 对 象 的 脚 本 语 言 , 自 2012 年 起 被 国 际 标 准 化 为ISO/IEC30170。随着物联网的出现,Matsumoto于2014年在GitHub上发布了一个名为mRuby(eMbedded Ruby)的Ruby解释器的紧凑版本[2]新的解释器是一个轻量级的实现,针对低功耗设备和个人计算机,并符合标准[3]。mRuby有一个全新的API,它被设计为嵌入在复杂的项目中作为前端接口-例如,数值优化套件可以使用mRuby进行问题定义。电子邮件地址:marteo. unitn.it。Ruby代码库在核心和标准库中公开了大量实用程序,可以通过第三方库或gem进一步扩展。在大量可用的gem中,Ruby仍然缺乏一个自动和符号区分(ASD)[4]引擎,可以处理基本的计算机代数例程,与所有不同的Ruby解释器兼容。如今,Ruby主要归功于面向Web的Rails框架。它的表现力和优雅使它在科学和技术领域的使用感兴趣一个支持ASD的gem将证明是朝着这个方向迈出的基础性一步,包括对高级软件(例如IPOPT)的灵活代码生成的支持[5,6]。CAS先生1是一个用纯Ruby实现的gem ,符号微分与计算机代数基础1Minimalistic Ruby计算机代数系统。http://dx.doi.org/10.1016/j.softx.2017.05.0022352-7110/©2017作者。由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softx()下一页M. Ragni / SoftwareX 6(2017)128-134129操作[7]。 该库旨在支持程序员,数字算法和代码生成的快速原型,用于不同的目标语言。它允许在实际数学公式和数值不稳定性的条件规则之间进行清晰的分离,以支持生成相对于特定应用可能引入的问题更鲁棒的代码。作为一个长期的努力,它将成为标准Ruby语言的完整开源Ruby的其他CAS库可用:Rucas,Symbolic:[8,9]里程碑式的宝石,但仍处于早期阶段,并处于停止开发状态。两者都提供了基本的简化程序,尽管它们缺乏差异化。Symengine:[10]是symengineC++库的包装器。后端库是非常完整的,但它只与vanilla C Ruby解释器兼容,并且有几个依赖项。据作者所知,gem不支持Ruby2.x解释器。在第2节中,详细解释了Mr.CAS容器和树结构,并将其应用于基本的CAS任务。第3节示例如何使用库作为代码生成器或接口进行了描述。最后,第4节描述了实施的原因和长期预期影响。所有代码列表都可以在http://bit.ly/Mr_CAS_examples上找到。2. 软件描述2.1. 软件构架CAS是一个面向对象的ASD gem,支持计算机代数例程,如简化和替换。当需要gem时,它重载Fixnum和Float类的方法,使它们与基本的符号类兼容每个符号表达式(或操作)都是一个对象的实例,它继承自一个公共的虚拟祖先:CAS::Op。一个操作递归地封装子操作,构建一个树,这是函数复合的数学等价物(f) (g)。(一)当一个新的操作被创建时,它被附加到树中。分支的数量由当前符号函数的父容器类决定。有三种可能的容器:Fig. 1. 清单1中派生的表达式的树。这就只剩下实数标量表达式,而复数、向量和矩阵扩展的定义则是下一个主要版本的里程碑。符号区分(CAS::Op#diff)探索图,直到它到达结束节点。终端节点是导数累积的起点,其数学等价于链式法则:(f)g)′=福格g′。( 二)递 归 性 也用 于 简 化 ( CAS : : Op #sim-plify ) 、 替 换(CAS::Op #subs)、求值(CAS::Op#call)和代码生成。2.2. 软件功能2.2.1. 基本功能不需要额外的依赖性。gem可以安装通过rubygems.org提供商。2 Gem功能重新-使用Kernel方法查询require所有方法CAS::Op单个子树操作-例如sin(·)。y和类封装在模块CAS中。CAS::BinaryOp对偶子树操作-例如指数x-继承自CAS::Op。CAS::NaryOp操作,具有任意数量的子树-例如,sumx1+···+xN-继承自CAS:: Op。图1包含表达式树的图形表示。不同类型的容器允许引入一些属性,即和与多重的结合性与交换性[11]。每个容器都将子树作为实例属性公开。基本的容器接口和继承如图2所示。有关所有类和继承的完整概述,请参阅软件文档。图的终端叶子是类CAS::Constant、CAS::Variable和CAS::Function。第一个模型是一个简单的数值,而第二个代表一个指数,符号微分(SD)是通过向前累加对独立变量(CAS::Variable)执行的,即使对于隐式函数也是如此。 区分是通过方法CAS::Op #diff完成的 , 它有一个CAS::Variable作为参数,如清单1所示。清单1:差异化示例z=CAS。varsf=z**2+1 #defineasymblic表达式F. diff(z)#derivat ivew. R. t.z# =>(z)^((2 - 1))* 2 * 1)+0)g=CAS。declare:g,f#createsimplicitexpressionG. diff(z)#derivat ivew. R. t. z#=>(z)^((2-1))*2*1)+0)*Dg[0](z)^(2)+1)悬垂变量,可用于执行衍生工具,计算,后者是隐函数的原型2宝石安装先生。≡···≥·130米Ragni/SoftwareX 6(2017)128符号表达式可用于创建比较表达式,这些比较表达式存储在特殊的容器类中,由祖先CAS::Condition建模-例如f()g()。这允许在CAS::Piece中定义分段函数。睿 的 在 内 部 , max ( ) 和 min ( ) 函 数 被 声 明 为 继 承 自CAS::Piecewise的操作-例如max(f(·),g(·))。清单4显示了它的用法。清单4:表达式和分段函数x,y=CAS。vars' x ', ' y' f = C A S. declare:f,xg=CAS。declare:g,x,y h=CAS. declare:h,yF. 大于等于g#=>(f(x)>=g(x,y))pw=CAS::Piecewise. n∈w(f,CAS::Piecewise. new(g,h,y. equal(0)),x. (0)# =>((x> 0)? f(x):((y 0)? g(x,y):h(y)CAS::maxf,g联系我们((f(x)>=g(x,y))? f(x):g(x,y))图二. 类接口和继承的简化版本。该图描述了基本抽象类CAS::Op,单参数 操 作 继 承 自 该 抽 象 类 。CAS:: Op 也 是 其 他 类 型 容 器 的 祖 先 , 即CAS::BinaryOp和CAS::NaryOp,具有两个或更多参数的容器模型。自动微分(AD)作为一个插件包括在内,并利用对偶数的属性来有效地执行微分,更多细节请参见[12]AD策略在复杂表达式的情况下很有用,其中显式导数在微分之后,简化不会自动执行树的每个节点都知道简化自身的规则,并且规则被递归地调用,就像ASD一样。需要对子图进行启发式扩展的简化(即一些三角恒等式)目前还没有定义,但可以通过替换轻松实现,如清单2所示。清单2:简化示例x,y=CAS::varsf=CAS。log(CAS. sin(y))#symbolicexpressionf.subsy=>CAS。asin( CAS. exp(x))#perforrms取代F. simplifies表达式#=> x当提要字典中提供独立变量值时,对树进行数值计算该图递归地缩减为单个数值,如清单3所示清单3:树计算示例x=CAS。varsf=x**2+1 #definesasymbolicexpressionf.callx => 2#evaluates forx = 2数量=>5.02.2.2. 元编程和代码生成CAS先生是为元编程和代码生成而开发的表达式可以作为源代码导出,也可以用作可调用闭包的原型(清单5中的Proc清单5:图计算示例x=CAS::vars功能proc=f。as_proc#exportscallllablelambdaproc. call# =>0.0编译树的闭包就像制作树的快照,因此对表达式的任何进一步操作都不会更新可调用对象。这个缺点被Proc的更快的执行时间所平衡:当一个图只需要被评估时,在闭包中转换它可以减少执行时间-例如,在迭代算法中,在每次迭代时都会调用闭包代码生成应该足够灵活,以便以用户的目标语言导出表达式树通用语言的生成方法包含在特定的插件中。用户还可以通过编写特定的导出规则、重写现有插件的方法或设计自己的导出器来扩展导出功能,如清单6所示:清单6:Ruby代码生成插件示例#RulesdefinitionforForFo{#. . .CAS::Variable=>Proc. new{“#{name}“}CAS::Sin=>Proc. new{“sin(#{x. to_fortran})“},#。. .}。 东亚共同体|香港邮政|cls。send(:define_methd,:to_fortran,prc)end端#用法x=CAS。varscode=(CAS. sin(x))。to_fortran#=>sin(x)3. 说明性实例3.1. 代码生成为C库这个例子展示了Mr.CAS的用户如何将数学模型导出为C库。c-opt插件实现了=·2∑=−≈2n()下一页.M. Ragni / SoftwareX 6(2017)128-134131高级功能,如代码优化和库的生成。其中p是收敛阶。使用不同的n值,例如2n,比率(8)取近似值:库示例实现了模型:f(x,y)=xy+g(x)log(sin(xy))(3)E[n]pE[2n]→p//LocalLibraries#include“g_impl“//Definitionsdoublef_impl(doublex,doubley){double_t_0=pow(x,y);double__t_1=g_impl(x);double__t_2=sin(__t_0);double__t_3=log(__t_2);double__t_4=(__t_1+__t_3);double__t_5=(__t_0+__t_4);//Functionsdoublef_impl(doublex,doubley);return__t_5;}#endif//example_H//endofexample. C#我的天a=CAS。declare“PARAM_A“清单10:导出函数中的条件g=(CAS. sqrt(x+a)-CAS。sqrt(x))+CAS。sqrt( CAS::Pi+x)#ParticularCodeGenerat ionfordiferencebetwensquareroots. 模块化CASclassDiffalias:__to_c_impl_old:__to_c_impldef__to_c_impl(v)if@x。是吗? CAS::Sqrtand@y。是吗?CAS::Sqrt“(#{ @x. X. __to_c(v)}+#{ @y. X.(v)“+“(#{ @x. __to_c(v)}+#{ @y. __to_c(v)})“elseSelf. __to_c_impl_old(v)end结束结束端CAS::CLib. create“g_impl“dodefine“PARAM_A()“,1. 0#ArbitraryvalueforPARAM_Adefine“M_PI“,Math::Piimplements_as“g_impl“,gend把g#=>((sqrt((x+PARAM_A()-sqrt(x))+sqrtπ((+x)清单11:g_implHeader清单12:g_impl源代码//文件类型:g_impl. C//我们的库文件:g_impl。C#ifndefg_impl_H#defineg_impl_H#include“g_impl. h“的//StanddLibraries#include//LocalLibraries//Definitions#definePARAM_A()1. 0#defineM_PI3. 141592653589793doubleg_impl(doublex){double_t_0=PARAM_A();double__t_1 =(x +__t_0);double__t_2 =sqrt(__t_1);double__t_3 =sqrt(x);double_t_4 =(_t_1 + x)/(_t_2 +_t_3);double_t_5=( M_PI+x);double_t_6 =sqrt(__t_5);double_t_7 =(__t_4 +__t_6);//Functionsdoubleg_impl(doublex);return__t_7;}#endif//g_impl_H//endofg_impl. CM. Ragni / SoftwareX 6(2017)128-134133require先生。 CAS清单13:Ruby版本Importsympyimportmath清单14:Python版本defintegrate(f,a,b,n)h =(b-a)/nfunc=F. AS过程sum=((func. ca1l“x”= > a)+(f un c. ca11“x”= >b))/ 2。0对于iin(1. n)的sum+=(func. callreturnsum*henddeforder(f,a,b,n)x=CAS. varsf_ab=(f.callx => b)-(f.callx =>a)df=f。diff(x).simplifyf_1n =integrate(df,a,b,n)f_2n =积分(df,a,b,2*n)我的天啊。l〇g((f_ab-f_ln)/(f_ab-f_2n),(二)端x=CAS。vars' x 'f = C A S. arctanxputs(orderf,-1.0,1.0,100)#=>1.999999974244451defintegrate(f,a,b,n):h =(b-a)/nx=sympy。symbols(func=sympy. lambdify((x),f)sums=(func(a)+func(b))/2.0对于范围(1,n)中的i:sums+=func(a+i*h)returnsums*hdeforder(f,a,b,n):x=sympy。symbols(f_ab=sympy。 Subs(f,(x),(b)). n()-\sympy。 Subs(f,(x),(a)). n()df=f.diff(x)f_1n= integrate(df,a,b、将所述第一n)f_2n= integrate(df,a,b,2 *n)我是你的朋友。l〇g((f_ab-f_ln)/(f_ab-f_2n),(二)x=sympy。symbols('x ')f = s y m p y。atan(x)print(order(f,-1.0,1.0, 100))#=>1.999999974244451$x,$y,$h=CAS::vars:x,:y,:h #Evaluatesn!清单15:ODE集成步骤的生成器def fact(n);(n <2? 1:n *fact(n - 1));end#Evaluatealderivesredederde fcoeff(f,n)DF=[f]for_in 2.. ndf<
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功