数学即代码

2020-06-13 16:32:33

这是一个参考,通过显示与JavaScript代码的比较,使开发人员更容易进入数学表示法。

本指南尚未完成。如果您看到错误或想要贡献,请开票或发送公关。

注意:为简洁起见,一些代码示例使用了NPM包。您可以参考他们的GitHub Repos以了解实现的详细信息。

根据作者、上下文和研究领域(线性代数、集合论等)的不同,数学符号可以有不同的含义。本指南可能不会涵盖符号的所有用法。在某些情况下,会引用真实世界的参考资料(博客文章、出版物等)来演示符号在野外可能是如何出现的。

为简单起见,此处的许多代码示例都对浮点值进行操作,并且在数值上并不健壮。有关为什么这可能是一个问题的更多详细信息,请参见Mikola Lysenko的鲁棒算术笔记。

根据上下文和研究领域的不同,命名约定有多种,并且它们并不总是一致的。但是,在某些文献中,您可能会发现变量名称遵循如下模式:

θ-代表常量和特殊变量的希腊小写斜体字母(例如极角θ,θ)。

有许多符号类似于等号=。以下是几个常见的示例:

//等式2=3//不等式2!==3//近似等于几乎相等(数学。Pi,3.14159,1e-5)函数几乎等于(a,b,ε){返回数学。ABS(a-b)<;=ε}。

但是,这是可变的,并且只获取当时值的快照。一些语言有预处理器#DEFINE语句,它更接近于数学定义。

复数是形式的表达式,其中是实部,是虚部。虚数定义为:

在JavaScript中,没有针对复数的内置功能,但是有一些库支持复数算术。例如,使用mathjs:

var MATH=REQUIRED(';mathjs&39;)var a=MATH。Complex(3,-1)//=>;{Re:3,im:-1}var b=数学。sqrt(-1)//=>;{re:0,im:1}控制台。LOG(数学。使(a,b)相乘。toString())//=>;';1+3i';

该库还支持计算字符串表达式,因此可以将上面的代码重写为:

它们可能看起来很明显,但在我们继续其他部分之前,了解其中的细微差别是很重要的。

通常,乘号仅用于避免歧义(例如,在两个数字之间)。在这里,我们可以完全省略它:

为了表示一个向量与标量的乘法,或者表示一个向量与另一个向量的元素相乘,我们通常不使用点·或交叉×符号。这些在线性代数中有不同的含义,简要讨论一下。

让我们以前面的例子为例,但将其应用于向量。对于基于元素的向量乘法,您可能会看到一个开点∘来表示Hadamard乘积。2个。

在其他情况下,作者可能会显式定义不同的符号,例如圆点⊙或实心圆。3个。

下面是它在代码中的外观,使用数组[x,y]来表示2D向量。

var s=3 var k=[1,2]var j=[2,3]var tmp=multiply(k,j)var result=multiyScalar(tmp,s)//=>;[6,18]。

函数multiply(a,b){return[a[0]*b[0],a[1]*b[1]]}函数multiyScalar(a,标量){return[a[0]*标量,a[1]*标量]}。

类似地,矩阵乘法通常不使用点·或交叉符号×。矩阵乘法将在后面的部分中介绍。

点符号·可用来表示两个向量的点积。有时这称为标量积,因为它的计算结果是标量。

这是线性代数的一个非常常见的功能,对于3D矢量,它可能如下所示:

var k=[0,1,0]var j=[1,0,0]var d=dot(k,j)//=>;0。

结果0告诉我们,我们的矢量是垂直的。以下是3分量矢量的点函数:

函数点(a,b){返回a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}。

交叉符号×可以用来表示两个向量的叉积。

var k=[0,1,0]var j=[1,0,0]var result=Cross(k,j)//=>;[0,0,-1]。

这里,我们得到[0,0,-1],它与k和j都垂直。

函数CROSS(a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2]var rx=ay*bz-az*by var ry=az*bx-ax*bz var rz=ax*by-ay*bx return[rx,ry,rz]}

大的希腊西格玛(Σ)是求和的。换句话说,就是把一些数字加起来。

这里,i=1表示从1开始,在西格玛100以上的数字结束。这分别是下界和上界。E&34;右边的i告诉我们要求和的内容。在代码中:

对于(var i=1;i<;=100;i++){sum+=i},var sum=0。

var n=100//上界var sum=(n*(n+1))/2。

对于(var i=1;i<;=100;i++){sum+=(2*i+1)},var sum=0。

该表示法可以嵌套,这非常类似于嵌套for循环。您应该首先计算最右边的sigma,除非作者已将它们括在括号中以更改顺序。但是,在下面的情况中,由于我们处理的是有限和,因此顺序并不重要。

(var i=1;i<;=2;i++){for(var j=4;j<;=6;j++){sum+=(3*i*j)}}。

大写Pi或Big Pi&34;与Sigma非常相似,不同之处在于我们使用乘法来求一系列值的乘积。

(var i=1;i<;=6;i++){value*=i}的var值=1。

管道符号称为条,根据上下文的不同可以表示不同的含义。下面是三种常见的用法:绝对值、欧几里得范数和行列式。

对于向量v,‖v‖是v的欧几里得范数,也称为向量的幅值或长度。

这通常由双条线表示,以避免绝对值表示法的歧义,但有时您可能会看到单条线:

以下是使用数组[x,y,z]表示3D矢量的示例。

函数长度(Vec){var x=vec[0]var y=vec[1]var z=vec[2]返回数学。sqrt(x*x+y*y+z*z)}。

下面是一个计算2x2矩阵行列式的示例,该矩阵由列为主格式的平面数组表示。

var行列式=REQUIRED(';gl-mat2/&39;)var矩阵=[1,0,0,1]var Det=行列式(矩阵)//=>;1

在几何学中,字符上方的符号用来表示单位向量。例如,以下是a的单位向量:

在笛卡尔空间中,单位向量的长度通常为1。这意味着向量的每个部分都将在-1.0到1.0的范围内。在这里,我们将3D向量规格化为单位向量:

函数标准化(Vec){var x=vec[0]var y=vec[1]var z=vec[2]var squaredLength=x*x+y*y+z*z if(squaredLength>;0){var length=Math。sqrt(SquaredLength)vec[0]=x/长度vec[1]=y/长度vec[2]=z/长度}返回vec}。

在集合论中,符号∈和∋的元素可以用来描述某事物是否为集合的元素。例如:

这里我们有一组数字A{3,9,14},我们说3是该集合的";元素。

但是,使用仅包含唯一值的集合会更准确。这是ES6的一项功能。

您也可以使用";而不是";符号∉和∌的元素,如下所示:

你可能会在方程式中看到一些很大的黑板字母。通常,它们被用来描述集合。

例如,我们可以将k描述为集合ℝ的一个元素。

大ℝ描述实数集。其中包括整数,以及有理数和无理数。

javascript将浮点型和整型视为同一类型,因此下面将是我们的k∈ℝ示例的简单测试:

有理数是可以用分数或比率(如⅗)表示的实数。有理数不能以零作为分母。

这也意味着所有整数都是有理数,因为分母可以表示为1。

另一方面,无理数是指不能用比率表示的数字,如π(PI)。

整数,即没有小数部分的实数。这些可以是积极的,也可以是消极的。

函数isInteger(N){返回类型为n=';&;&;n%1=0}

一个自然数,一个正非负整数。根据上下文和研究领域的不同,集合可能包含零,也可能不包含零,因此它看起来可能类似于以下任意一个:

复数是实数和虚数的组合,被视为2D平面中的坐标。有关更多信息,请参阅虚数的直观指南。

函数是数学的基本特征,这个概念很容易转换成代码。

函数将输入与输出值相关联。例如,以下是一个函数:

我们可以给这个函数命名。通常,我们使用ƒ来描述函数,但也可以将其命名为A(X)或任何其他名称。

在上面的示例中,x是输入,关系是平方的,y是输出。

函数也可以有多个参数,就像在编程语言中一样。这些在数学上称为参数,而函数采用的参数数量称为函数的数量。

这与代码中的if/Else非常相似。对于x<;0&34;,右侧条件通常写为";,如果x=0";,则写为";。如果条件为真,则使用左侧的函数。

函数f(X){if(x&>;=1){return(Math.。POW(x,2)-x)/x}否则{返回0}}。

有一些函数名称在数学中无处不在。对于程序员来说,这些可能类似于语言的内置函数(如JavaScript中的parseInt)。

SGN函数就是这样一个例子。这是Signum或Sign函数。让我们使用分段函数表示法来描述它:

函数sgn(X){if(x<;0)return-1 if(x>;0)return 1 return 0}。

在一些文献中,函数可以用更明确的符号来定义。例如,让我们回到前面提到的Square函数:

这里带尾巴的箭头通常表示";映射到,就像在x映射到x2一样。

有时,当它不明显时,符号还会描述函数的域和同域。ƒ的一个更正式的定义可能写成:

函数的域和协域分别有点像它的输入和输出类型。下面是另一个示例,使用我们前面的sgn函数,该函数输出一个整数:

在JavaScript和其他动态类型语言中,您可以使用文档和/或运行时检查来解释和验证函数的输入/输出。示例:

/*将数字平方。*@param{number}一个实数*@return{number}一个实数*/函数Square(A){if(typeof a!==';number';){抛出新的TypeError(';期望一个数字';)}返回数学。战俘(a,2)}。

其他语言,如Java,允许基于函数的输入/输出的静态类型进行真正的方法重载。这更接近于数学:如果两个函数使用不同的域,则它们是不同的。

素数符号(‘)通常用在变量名中,用来描述相似的事物,而不会给它一个完全不同的名称。它可以描述经过一些转换后的下一个值。

例如,如果我们取一个二维点(x,y)并旋转它,您可以将结果命名为(x‘,y’)。或者,矩阵M的转置可以命名为M‘。

对于数学函数,素数符号通常描述该函数的导数。衍生品将在未来的一节中解释。让我们以前面的函数为例:

可以使用多个素数符号来描述二阶导数ƒ“”和三阶导数ƒ“”。在此之后,作者通常用罗马数字ƒIV或上标数字ƒ(N)表示更高的顺序。

特殊括号⌊x⌋和⌈x⌉分别表示楼层和天花板函数。

当两个符号混合为⌊x⌉时,它通常表示四舍五入为最接近整数的函数:

在函数表示法中经常使用箭头。以下是您可能会看到的其他几个区域。

像⇒和→这样的箭头有时在逻辑中用来表示实质含义。也就是说,如果A为真,那么B也为真。

箭头可以指向⇐⇒方向中的任意一个,也可以同时指向两个⇔方向。当A⇒B和B⇒A时,它们被认为是等价的:

在数学中,<;>;≤和≥的使用方式通常与我们在代码中使用它们的方式相同:分别小于、大于、小于或等于和大于或等于。

50>;2=TRUE 2<;10=TRUE 3<;=4=TRUE 4>;=4=TRUE。

在很少的情况下,你可能会看到这些符号上有一个斜杠,用来描述不是。如上所述,k不大于";j。

≪和≫有时用来表示显著的不平等。也就是说,k是比j大的数量级。

在数学中,数量级是相当具体的;它不仅仅是一个非常大的差别。";上面的一个简单例子:

函数log10(N){//以10为底的返回数学中的对数。log(N)/Math。ln10}函数顺序OfMagnitude(N){返回数学。trunc(log10(N))}。

逻辑中箭头的另一个用法是合取∧和析取∨。它们分别类似于程序员的AND和OR运算符。

在JavaScript中,我们使用&;&;。假设k是自然数,则逻辑暗示k是3:

偶尔,…,~和!符号用于表示逻辑NOT。例如,只有当A为FALSE时,-A才为TRUE。

注:波浪号~根据上下文有很多不同的意思。例如,行等价(矩阵理论)或相同数量级(在等式中讨论)。

有时,函数处理的实数被限制在某个值范围内,这样的约束可以使用区间来表示。

例如,我们可以将介于0和1之间的数字表示为包括/不包括0和/或1:

例如,要指示点x在三维单位立方体中,我们说:

var nextafter=request(';nextater';)var a=[nextater(0,无穷),nextater(1,-无穷)]//打开间隔var b=[nextater(0,无穷),1]//左侧关闭的间隔var c=[0,nextater(1,-无穷)]//右侧关闭的间隔var d=[。

变量INTERVAL=REQUIRED(';INTERVAL-算术)var Nextafter=REQUIRED(';NEXTER';)var a=INTERVAL(3,NEXTER(5,-Infinity))var b=INTERVAL(4,6)INTERVAL。交叉口(a,b)//{lo:4,hi:4.999999999999999}间隔。Union(a,b)//{lo:3,hi:6}间隔。差异(a,b)//{lo:3,hi:3.9999999999999996}间隔。差异(b,a)//{lo:5,hi:6}