ganja.js:适用于JavaScript,C ++,C#,Rust,Python的几何代数生成器

2020-12-19 04:57:06

Ganja.js是JavaScript的几何代数代码生成器。它生成任何签名的Clifford代数和子代数,并实现运算符重载和代数常数。

@misc {https://doi.org/10.5281/zenodo.3635774,doi = {10.5281 / ZENODO.3635774},url = {https://zenodo.org/record/3635774},作者= {De Keninck,Steven },标题= {ganja.js},发布者= {Zenodo},年份= {2020}}

(从数学上讲,由ganja.js生成的代数是具有外部非度量外积,具有几何和收缩内积的扩展(Clifford),Poincare对偶算子和(e)的渐变外(Grassmann)代数(或其子代数之一)。主要对合和态射。)

(从技术上讲,ganja.js是一个代码生成器,通过使用反射,内置的标记器和简单的AST转换器将包含代数构造的函数重写为程序上的对等物,从而生成代数文字和表达式的类。)

(实际上,ganja.js在javascript中启用了真正的数学语法,包括对实数,复数,对偶数,双曲线数,向量,时空事件,四元数,对偶四元数,双四元数或任何其他Clifford代数的元素,向量和矩阵运算。)

(认真地看示例,使用GAlculator运行一些快速数字,或者先玩楔子游戏。)

ganja.js现在具有基于nodejs的模板化源代码生成器,该生成器允许为C ++,C#,python和rust创建任意代数。生成的代码以平面多矢量格式提供,并且运算符重载。请检查&codegen'在源文件夹中,预生成版本中提供了多个代数。

Ganja.js使在浏览器中进行几何代数变得轻松而有趣。它的内联语法和图形使浏览器中的数学感觉像..数学。

1D和2D功能的简单图形功能,投影2D,3D和保形2D和3D元素。 (SVG / webGL / OPNS)

要创建代数,请调用Algebra函数以指定metricsignature(正维数,负维数和零维数)。结果是ES6类实现了所请求的悬崖代数。

函数代数(p,q,r,func); // p =正尺寸的数量。 // q =否定尺寸的可选数。 // r =可选的零尺寸数。 // func =可选函数。 (简写..传递给.inline并执行)

还提供了扩展语法,使您可以进一步调整创建的代数。

功能代数(选项,函数); // options =包含// // // p,正尺寸整数的子集的对象。 // q,是负尺寸的整数。 // r,零尺寸的整数。 //指标,[a,b,..]数组,其中每个生成维度都有指标。 (例如,PGA2D的[0,1,1])//否决了标准规范的基础,[" 1"," e1"," e2"]基础基础。 // Cayley,[[" 1"," e1"],[" e1"," -1"]]要取消的Cayley表标准GA表。 //用于元素的baseType,float32Array(默认值),float64Array,.. baseType。 // mix设置为true以启用可互操作的子代数。 (默认为false)。 //} //返回:如果没有提供func,则返回代数类;如果提供func,则返回函数结果。

//基本var Hyper = Algebra(1); //双曲数。 var Complex =代数(0,1); //复数。 var Dual =代数(0,0,1); //双数。 var H =代数(0,2); //四元数。 // Clifford var Cl2 =代数(2); // 2D向量空间的Clifford代数。 var Cl3 =代数(3); // 3D向量空间的Clifford代数。 var timeSpace =代数(1,3); //时空向量的Clifford代数。 // SubAlgebras var Complex = Algebra({p:3,base:[' 1',' e123']})); //复数作为Cl3的子代数var H =代数({p:3,基础:[' 1',' e12',' e13',&# 39; e23']}); //四元数作为Cl3的偶数子代数//几何var PGA2D =代数(2,0,1); //投影欧式2D平面。 (对偶)var PGA3D =代数(3,0,1); //投影欧几里得3D空间。 (双)var CGA2D =代数(3,1); //共形2D空间。 var CGA3D =代数(4,1); //保形3D空间。 //高维GA var DCGA3D =代数(6,2); //双保形3D空间。 var TCGA3D =代数(9,3); //三重保形3D空间。 var DCGSTA =代数(4,8); //双保形几何时空代数。 var QCGA =代数(9,6); //二次保形几何代数。

现在,您可以使用这些类来生成代数元素。这些元素将具有所有预期的属性。 (长度,刀片访问,点,楔,Mul,Dual,Inverse等...)

尽管没有建议,您也可以在“经典”中使用它们。编程风格的语法,如下例所示。

var Complex =代数(0,1); //复数。 var a = new Complex([3,2]); // 3 + 2i var b = new Complex([1,4]); // 1 + 4i返回一个。穆(b); //返回[-5,14]

但是,这不是很漂亮。也没那么有趣。幸运的是,ganja.js提供了一种替代的方式来编写代数函数,文字和表达式。

您的Algebra类通过内联函数公开此接口。它接受一个javascript函数,并将其转换为使用您选择的代数。使用内联函数,可以编写以上示例:

请注意,如果立即执行该函数,则可以将其作为最后一个参数添加到Algebra构造函数调用中。

内联语法功能强大且灵活。它提供了完整的运算符重载,重载了科学的e-表示法,使您可以直接指定基本刀片,并允许使用数组或lambda表达式,而无需在代数表达式中调用方括号。

代数(2,0,1,()= {//使用e-符号直接指定基础刀片。var xy_bivector = 1e12,pseudoscalar = 1e012; //运算符重载.. * =几何乘积,^ =楔形,& = vee,<< =点,>>> =三明治... var xy_bivector_from_product = 1e1 * 1e2; //直接指定的点。var some_point = 1e12 + 0.4e01 + 0.5e02; //返回的函数point。var function_that_returns_point =()=> some_point + 0.5e01; //注意点和函数的连接..注意没有调用方括号.. var join_between_point_and_function = some_point& function_that_returns_point; //与上述相同,但作为函数。 。(因此,如果点改变,也会更新)var function_that_returns_join =()=> some_point& function_that_returns_point; //数组上的二进制运算也按预期工作var even = [1,2,3,4,5] * 2 ; //即使它们包含多重向量或其他数组:var funky = [1 ,1e01 + 0.5e02,[3,4]] * 3 + [1,2,3]; //所有元素和函数都可以直接呈现。 (再次,没有方括号)。 var canvas = this。图([some_point,function_that_returns_point,function_that_returns_join]); });

//漂亮的数学表达式(!= dual,^ = wedge)a =()=&gt ;! (!a ^!b)*(c * 1e23)//被转换为.. b =()=>这个 。 Mul(this.Dual((this.Wedge(this.Dual(a),this.Dual(b))))),(this.Mul(c,this.Coeff(6,1))))()。(

在上面的示例中,函数a和b的作用相同,但是应该清楚a-b = headacheache。由于我是阿司匹林,所以我将其证明留给读者。

代数还公开了一个静态图形功能,使您可以轻松地图形化1D或2D函数以及2D和3D PGA和CGA元素。

canvas =代数(0)。图(x =>数学sin(x * 5)); //在R canvas = Algebra(0)中绘制一个一维函数的图。图((x,y)=> x + y); //在R svg = Algebra(2,0,1,()=> this。graph([1e12,1e1,1e2]))中绘制2D函数图; //在2D PGA svg = Algebra(3,0,1,()=> this。graph([1e123,1e23,1e13,1e12],{camera:1 + .5e01 -.5e02}))); //和在3D PGA中,canvas = Algebra(4,1,()=>此。graph([.5e4-.5e5],{conformal:true,gl:true}); // 3D CGA中的原点

要显示基本刀片名称,度量,Cayley表等,请使用静态描述功能。

请访问咖啡店并尝试使用示例。它们是交互式的,您可以轻松地在线更改代码。无需下载或安装任何东西!

ganja.js还是GAlculator的引擎-在线尝试或在Play商店购买

或者-通过玩楔形游戏来获得有关欧洲风云飞机PGA的经验。

Ganja.js允许您进一步自定义生成的代数类,从而允许您生成子代数(其元素无用的存​​储)或代数,在这些代数中您可以确定基础刀片的顺序和名称。 (名称应始终为e xyz,但您可以选择e 20,而不是默认的e 02,并希望ganja.js进行适当的符号更改)

通过将选项对象作为第一个参数传递给Algebra调用,可以使用高级选项。

//复数作为R2 C的偶数子代数=代数({p:2,基数:[' 1',' e12']})); //作为R3的偶数子代的四元数var H = Algebra({p:3,base:[' 1',' e12',' e13', ' e23']});

如果未指定,ganja.js将生成按等级分组并按数字排序的基础名称。默认情况下,单个零维将获得生成器名称e0。零维为首。

注意多向量" mv"的标量部分。可以使用&mb.mv.s"来解决,其他基准刀片遵循预期的模式。例如" mv.e12"或&mv.e012"。

默认情况下,您的代数元素将从Float32Array继承。您可以将ganja.js使用的基础数据类型更改为任何类型化数组基础类型:

或者更进一步,只需根据自己的喜好指定Cayley表即可。下面的示例显示自动数值微分并计算任何多项式的值,一阶,二阶和三阶导数。

var base = [' 1' ,' e1' ,' e2' ,' e3' ]; var Cayley = [[' 1' ,' e1' ,' e2' ,' e3' ],[' e1' ,' e2' ,' e3' ,' 0' ],[' e2' ,' e3' ,' 0' ,' 0' ],[&e39' ,' 0' ,' 0' ,' 0' ]];代数({basis,Cayley},()=> {var f =(x)=> 0.25 * x * x * x * x-0.5; for(var i =-5; i< 5; i + +)控制台log(i,f(i + 1e1));});

-5 [155.75,-125,37.5,-5] -4 [63.5,-64,24,-4] -3 [19.75,-27,13.5,-3] -2 [3.5,-8,6,- 2] -1 [-0.25,-1,1.5,-1] 0 [-0.5,0,0,0] 1 [-0.25,1,1.5,1] 2 [3.5,8,6,2] 3 [ 19.75,27,13.5,3] 4 [63.5,64,24,4]

出于存储和性能的原因,将给定代数的各个子代数的元素进行组合可能会很有趣。 Ganja.js通过在创建代数时将options.mix设置为true来支持这一点。

//创建R2-2D向量的Clifford代数-表示要使用混合模式。 var R2 = Algebra({p:2,q:0,r:0,mix:true}); //将复数创建为R2的偶数子代数。 var C = Algebra({p:2,q:0,r:0,基础:[' 1',' e12'],mix:true}); // R2的元素具有四个组成部分。 //创建复数1 + 4i var a = new R2([1,0,0,4])// C的元素具有两个组成部分。 //创建复数3 + 2i var b = new C([3,2]); //他们可以互操作.. a。穆(b); //返回R2的元素:[-5,0,0,14] b。穆(a); //返回C的元素:[-5,14]

启用混合模式后,ganja.js生成的所有操作将使用基本名称访问而不是数组索引。 (并且所有操作都得到保护,以用0代替丢失的刀片)。

仍可以使用内联语法,请记住,在大多数情况下,您希望将其用作' parent'的内联函数。代数(在上面的示例中,请使用R2.Inline而不是C.Inline,因为后者会将您的所有操作减少到C字段中)。

请注意,运算符优先级在JavaScript中一如既往,但Wedge,Vee,Dot和Sandwich除外,它们的优先级比*和/高,因此在许多常见的GA表达式中括号较少。

对偶运算符实现Poincare对偶,即使所考虑的子空间的伪标量退化,该定义和实现也可以工作。对于n维子空间的anyk矢量x,将其定义为包含所有不在x中的基本矢量的n k矢量y。对于非退化指标,如果需要,您仍可以将乘法与伪标量一起使用(尽管效率较低)

实现的点积是左收缩-没有任何扩展或修改。几何意义通常表示为x和y之间的点积给出x在y上的投影的y中的正交补码。

vee产品可作为对偶楔形的对偶的优化简写形式。

我选择了&符号,因为它可以解释为' join'或&meet'取决于赋予向量的几何含义。 (平面/线或点)

想要快速开始使用2D投影几何代数吗?下面的沸腾板可以带您一堆有用的标识(咖啡店有很多示例)。

Warning: Can only detect less than 5000 characters