2019独角兽企业重金招聘Python工程师标准>>>

计算机代数系统有很多,功能也侧重于不同的方面。最有名的当属Wolfram Research出品的Mathematica,其他比较有名的有Maple, OpenAxiom 等,Maxima也是其中比较有名的。

Maxima下载:

https://sourceforge.net/projects/maxima/files/

Android 下也有port :

https://github.com/YasuakiHonda/Maxima-on-Android

Maxima 是用lisp实现的,性能不太好,大规模计算时要小心优化。下面给出 Maxima 几个简单的例子:

1. 计算Dirac γ 矩阵的迹

Tr.mac

Tr(u):=
block([ele_num:length(u), result:0, i, sublist1:delete(u[1], u), sublist2],if oddp(ele_num) then return(0)else (if ele_num = 2 then return(MT(u))else (for i:2 thru ele_num do (sublist2:delete(u[i], sublist1),result:result+(-1)^(i-1)*MT(u[1], u[i])*Tr(sublist2)),return(result)))
);

上面是定义如何计算trace的函数,要调用它,可以在同一个目录下运行maxima,然后load("Tr.mac"),就可以直接调用了。示例代码如下:

praise@aliyun:~/Template/Maxima$ maximaMaxima 5.24.0 http://maxima.sourceforge.net
using Lisp GNU Common Lisp (GCL) GCL 2.6.7 (a.k.a. GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1) load("Tr.mac");
(%o1)                               Tr.mac
(%i2) Tr([a,b,c,d]);
(%o2)  - MT(a, b) MT([c, d]) + MT(a, c) MT([b, d]) - MT(a, d) MT([b, c])
(%i3)

2. 解线性方程

Maxima也有图形界面wxMaxima,下面是在wxMaxima中求解线性方程的代码,将其复制并保存为 .wxm 文件,即可在 wxMaxima 中打开。

/* [wxMaxima: input   start ] */
/* -------------------------------------Solve the linear equation systemA.x = b
--------------------------------------- */
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* --------- define A ------------ */A:matrix([1,(T1-delta),(T1-delta)^2,(T1-delta)^3],[1,T1,T1^2,T1^3],[0,1,2*(T1-delta),3*(T1-delta)^2],[0,1,2*T1,3*T1^2]);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ------------- get inverse A -------------- */Ainv:invert(A);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ------------- define b -------------- */b:matrix([t0/T1*P+D],[D],[P/T1],[P/T2]);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ----------------- solve -------------- */result:Ainv.b;
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ------------------ simplify ------------------ */eq:T1-delta=t0;
x:scsimp(result,eq);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ------------------- check ----------------- */subst([T1=5,T2=10,t0=4.9,delta=0.1,P=0.2], A.x);
subst([T1=5,T2=10,t0=4.9,delta=0.1,P=0.2], b);
/* [wxMaxima: input   end   ] */

可以看到,wxMaxima中的注释采用和c/c++相同的风格。

3. 自然边界条件下的三次样条拟合

/* [wxMaxima: input   start ] */
/* -------------------------------------------------------------this is a script for cubic spline with nature boundary condition------------------------------------------------------------ */
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* --------------- Definition ----------------- */point_num : 8;array(knots,point_num,2);
array(kcoe,point_num);
array(aij,point_num,2);
array(bi,point_num);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* --------------- Test data set --------------- */for i:0 thru point_num step 1
doblock(knots[i,0]: i,knots[i,1]: -8+i*16/point_num,knots[i,2]: sin(knots[i,1]/4*%pi));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* =============== The first variable spline ================ */
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* -------------- Initiate the linear system --------------- */for i:0 thru point_num step 1
doif i = 0 thenblock(aij[i,0] : 2,aij[i,1] : 1,aij[i,2] : 0,bi[i] : 3*(knots[1,1]-knots[0,1])/(knots[1,0]-knots[0,0]))elseif i = point_num thenblock(n : point_num,aij[i,0] : 1,aij[i,1] : 2,aij[i,2] : 0,bi[i] : 3*(knots[n,1]-knots[n-1,1])/(knots[n,0]-knots[n-1,0]))elseblock(aij[i,0] : 1/(knots[i,0]-knots[i-1,0]),aij[i,1] : 2*(1/(knots[i,0]-knots[i-1,0])+1/(knots[i+1,0]-knots[i,0])),aij[i,2] : 1/(knots[i+1,0]-knots[i,0]),bi[i] : 3*((knots[i,1]-knots[i-1,1])/(knots[i,0]-knots[i-1,0])^2+(knots[i+1,1]-knots[i,1])/(knots[i+1,0]-knots[i,0])^2));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ---- Solve the linear system by tridiagonal algorithm ---- */array(ci, point_num);
array(di, point_num);for i:0 thru point_num step 1
doif i = 0 thenblock(ci[i] : aij[i,1]/aij[i,0],di[i] : bi[i]/aij[i,0])elseblock(tmp : aij[i,1]-aij[i,0]*ci[i-1],ci[i] : aij[i,2]/tmp,di[i] : (bi[i]-aij[i,0]*di[i-1])/tmp);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* -------------- Continue -------------- */for i:point_num thru 0 step -1
doif i = point_num thenkcoe[i] : di[i]elsekcoe[i] : di[i]-ci[i]*kcoe[i+1];
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* -------------- Define the middle coefficients ------------- */array(a, point_num);
array(b, point_num);for i:1 thru point_num step 1
doblock(a[i] : kcoe[i-1]*(knots[i,0]-knots[i-1,0])-(knots[i,1]-knots[i-1,1]),b[i] : -kcoe[i]*(knots[i,0]-knots[i-1,0])+(knots[i,1]-knots[i-1,1]));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ---------------- Get the interpolation functions ------------- */t : (x-knots[i-1,0])/(knots[i,0]-knots[i-1,0]);
define(fun1(i, x),(1-t)*knots[i-1,1]+t*knots[i,1]+t*(1-t)*(a[i]*(1-t)+b[i]*t)
);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* =============== The second variable spline ================ */
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* -------------- Initiate the linear system --------------- */for i:0 thru point_num step 1
doif i = 0 thenblock(aij[i,0] : 2,aij[i,1] : 1,aij[i,2] : 0,bi[i] : 3*(knots[1,2]-knots[0,2])/(knots[1,0]-knots[0,0]))elseif i = point_num thenblock(n : point_num,aij[i,0] : 1,aij[i,1] : 2,aij[i,2] : 0,bi[i] : 3*(knots[n,2]-knots[n-1,2])/(knots[n,0]-knots[n-1,0]))elseblock(aij[i,0] : 1/(knots[i,0]-knots[i-1,0]),aij[i,1] : 2*(1/(knots[i,0]-knots[i-1,0])+1/(knots[i+1,0]-knots[i,0])),aij[i,2] : 1/(knots[i+1,0]-knots[i,0]),bi[i] : 3*((knots[i,2]-knots[i-1,2])/(knots[i,0]-knots[i-1,0])^2+(knots[i+1,2]-knots[i,2])/(knots[i+1,0]-knots[i,0])^2));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ---- Solve the linear system by tridiagonal algorithm ---- */array(ci, point_num);
array(di, point_num);
for i:0 thru point_num step 1
doif i = 0 thenblock(ci[i] : aij[i,1]/aij[i,0],di[i] : bi[i]/aij[i,0])elseblock(tmp : aij[i,1]-aij[i,0]*ci[i-1],ci[i] : aij[i,2]/tmp,di[i] : (bi[i]-aij[i,0]*di[i-1])/tmp);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* -------------- Continue -------------- */for i:point_num thru 0 step -1
doif i = point_num thenkcoe[i] : di[i]elsekcoe[i] : di[i]-ci[i]*kcoe[i+1];
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* -------------- Define the middle coefficients ------------- */array(a, point_num);
array(b, point_num);
for i:1 thru point_num step 1
doblock(a[i] : kcoe[i-1]*(knots[i,0]-knots[i-1,0])-(knots[i,2]-knots[i-1,2]),b[i] : -kcoe[i]*(knots[i,0]-knots[i-1,0])+(knots[i,2]-knots[i-1,2]));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ---------------- Get the interpolation functions ------------- */s : (x-knots[i-1,0])/(knots[i,0]-knots[i-1,0]);
define(fun2(i, x),(1-s)*knots[i-1,2]+s*knots[i,2]+s*(1-s)*(a[i]*(1-s)+b[i]*s)
);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* ===================== Finalize and Plot ==================== */
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
define(myx(x),
block(
if x < 1 thenfun1(1,x)
elseif x < 2 thenfun1(2,x)
elseif x < 3 thenfun1(3,x)
elseif x < 4 thenfun1(4,x)
elseif x < 5 thenfun1(5,x)
elseif x < 6 thenfun1(6,x)
elseif x < 7 thenfun1(7,x)
elsefun1(8,x)
));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
define(myy(x),
block(
if x < 1 thenfun2(1,x)
elseif x < 2 thenfun2(2,x)
elseif x < 3 thenfun2(3,x)
elseif x < 4 thenfun2(4,x)
elseif x < 5 thenfun2(5,x)
elseif x < 6 thenfun2(6,x)
elseif x < 7 thenfun2(7,x)
elsefun2(8,x)
));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
load(draw);
draw2d(parametric(myx(x),myy(x),x,knots[0,0],knots[point_num,0]));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
/* =================== Test and Check ================= */
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
for i:0 thru point_num step 1
do display(knots[i,1], knots[i,2]);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
for i:0 thru 8 step 0.1
do display(myy(i));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
for i:0 thru 8 step 0.1
do display(myx(i));
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
plot2d(myx(x),[x,0,8]);
/* [wxMaxima: input   end   ] */
/* [wxMaxima: input   start ] */
for i:0 thru point_num step 1
doblock(display(kcoe[i]),display(bi[i]),display(aij[i,0],aij[i,1],aij[i,2]),display(a[i], b[i]),print("-----"));
/* [wxMaxima: input   end   ] */

转载于:https://my.oschina.net/propagator/blog/798502

一款开源计算机代数系统(CAS)Maxima相关推荐

  1. 历史上最有影响力的10款开源项目

    开源是大趋势,开源软件也在越来越多的出现在日常电脑桌面上,如Firefox浏览器.Ubuntu操作系统等.人们选择开源软件的原因,主要有低成本.安全无病毒侵害.更加透明和开放等.按照大多数的开源协议如 ...

  2. Metasploit是一款开源的安全漏洞检测工具,

    Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,适合于需要核实漏洞的安全专家,同时也适合于强大进攻能力的 ...

  3. 顶级的 18 款开源的低代码开发平台,经典收藏

    点击上方"Github中文社区",关注触达Github项目 文 | 白开水 出品 | OSC开源社区 低代码成了企追求的主流目标,与使用计算机编程语言构建应用程序的传统方法不同,低 ...

  4. 5款开源云计算平台推荐

    云计算是个IT界火热的词汇,开源云计算更是被认为是IT的趋势.我们熟知的几个IT巨头的云计算平台,如亚马逊EC 2.IBM的蓝云.微软的Azure.Sun Cloud等,那么开源云计算的平台又有哪些呢 ...

  5. 玩转Windows下40款开源软件 (转)

    玩转Windows下40款开源软件   <script src="http://blog.csdn.net/count.aspx?ID=1789004&Type=Rank&qu ...

  6. 玩转Windows下40款开源软件

    这是国外较有影响的网站于2007年9月8日发布的新文章,算是windows下20款开源软件的续篇.发出不久,digg数已上千.xbeta进行简译,以便于国内用户在免费软件方面有更多选择. 信息安全 这 ...

  7. 开源公司黄页 关于/ 阿里巴巴的50款开源软件[大部分为Java语言]

    服务框架 Dubbo Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remot ...

  8. 顶级的18 款开源低代码开发平台

    文 | 白开水 出品 | OSC开源社区 低代码成了企追求的主流目标,与使用计算机编程语言构建应用程序的传统方法不同,低代码开发平台是使用图形向导来创建和构建软件的应用程序开发平台.因此,在许多情况下 ...

  9. 科技公司最常用的50款开源工具,提升你的逼格~

    点击关注上方"视学算法",设为"置顶或星标",第一时间送达技术干货. 本文介绍了多款知名的开源应用软件,科技公司可以用它们来管理自己的 IT 基础设施.开发产品 ...

  10. 介绍一款开源的类Excel电子表格软件

     Excel一直以霸主的地位,占领了Windows桌面表格软件市场No 1,与此同一时候,Office套装产品差点儿成为了IT行业的标配办公技能.有无相似Excel的桌面程序,绿色版,实现主要的数 ...

最新文章

  1. 没有为类型定义方法怎么办_拼多多开店没有流量怎么办?有什么方法?新手必看!...
  2. 红黑树的原理_红黑树插入算法实现原理分析
  3. css使两个盒子并列_css如何去掉重叠部分的边框?
  4. 十天冲刺---Day8
  5. Python3字符串
  6. mybatis学习(21):MySQL 字符串 转换 CAST与CONVERT 函数的用法
  7. 基础知识(二)matlab与c++混合编程之经验笔记
  8. c#和java_C#和Java接口对比
  9. JavaScript 编程精解 中文第三版 翻译完成
  10. 抖音发布春节数据报告:394万个视频和平安相关 医务人员获赞8.6亿次
  11. 升级Tornado到4后weibo oauth登录不了
  12. mask rcnn 召回率_搜索推荐召回amp;amp;粗排相关性优化最新进展—2020
  13. ajax 的post方法用例(带循环)
  14. 逐像元地表反射率计算(GF4)
  15. 皮尔森相关系数与方差膨胀因子介绍及关系 附python代码
  16. 计算机快速换界面,老板来了?这些好用的Windows快捷键让你一秒切换操作界面!-页面设置快捷键...
  17. 4K图片(壁纸)免费下载网站【实用】
  18. 植物大战僵尸:实现灵魂收割者
  19. 拼接播放地址_杰和科技G330六屏拼接主机带来差异化6屏拼接方案
  20. android融云自定义通知,android融云消息免打扰

热门文章

  1. python 小说爬虫_初次尝试python爬虫,爬取小说网站的小说。
  2. 教程向|3D建模最难之面部雕刻,详细教程带给大家(下)
  3. 苹果手机换电池对手机有影响吗_网上预约手机上门换电池可靠吗?官方回应:售后也这么换!...
  4. 什么是云主机?有什么用途?
  5. Hdu2104(主席树)
  6. python随机漫步
  7. 文献 | 一眨眼就错过了的心理机制
  8. Week 8 CSP M2 HRZ学英语
  9. 11月合资SUV销量:日系车统治榜单 大众产品攻势“拳意渐乱”
  10. 不知道如何压缩PDF?教你3个压缩PDF文件方法