components/mathjs

Math.js 是一个功能丰富的 JavaScript 和 Node.js 数学库。它具有一个灵活的表达式解析器,支持符号计算,包含大量内置函数和常数,并提供了一个集成的解决方案来处理不同类型的数据,如数字、大数、复数、分数、单位和矩阵。功能强大且易于使用。

安装量: 3,027

依赖者: 0

推荐者: 0

安全性: 0

星标: 14,314

关注者: 223

分支: 1,236

开放问题: 132

语言:JavaScript

类型:组件


README

math.js

https://mathjs.org

Math.js 是一个功能丰富的 JavaScript 和 Node.js 数学库。它具有一个灵活的表达式解析器,支持符号计算,包含大量内置函数和常数,并提供了一个集成的解决方案来处理不同类型的数据,如数字、大数、复数、分数、单位和矩阵。功能强大且易于使用。

Version Downloads Build Status Maintenance License FOSSA Status Codecov Github Sponsor

功能

  • 支持数字、大数、大整数、复数、分数、单位、字符串、数组和矩阵。
  • 与 JavaScript 的内置 Math 库兼容。
  • 包含一个灵活的表达式解析器。
  • 支持符号计算。
  • 包含大量内置函数和常数。
  • 也可以用作命令行应用程序。
  • 在任意 JavaScript 引擎上运行。
  • 易于扩展。
  • 开源。

使用方法

Math.js 既可以用于 node.js 也可以用于浏览器。

使用 npm 安装 math.js

npm install mathjs

或者通过下载页面上的 CDN 之一下载 mathjs

    https://mathjs.org/download.html

Math.js 可以像 JavaScript 的内置 Math 库一样使用。除此之外,math.js 还可以评估 表达式 并支持 链式操作

import {
  atan2, chain, derivative, e, evaluate, log, pi, pow, round, sqrt
} from 'mathjs'

// functions and constants
round(e, 3)                    // 2.718
atan2(3, -3) / pi              // 0.75
log(10000, 10)                 // 4
sqrt(-4)                       // 2i
pow([[-1, 2], [3, 1]], 2)      // [[7, 0], [0, 7]]
derivative('x^2 + x', 'x')     // 2 * x + 1

// expressions
evaluate('12 / (2.3 + 0.7)')   // 4
evaluate('12.7 cm to inch')    // 5 inch
evaluate('sin(45 deg) ^ 2')    // 0.5
evaluate('9 / 3 + 2i')         // 3 + 2i
evaluate('det([-1, 2; 3, 1])') // -7

// chaining
chain(3)
    .add(4)
    .multiply(2)
    .done()  // 14

查看 入门 获取更详细的教程。

浏览器支持

Math.js 在任何 ES2020 兼容的 JavaScript 引擎上运行,包括 node.js、Chrome、Firefox、Safari 和 Edge。

文档

构建

首先从 github 复制项目

git clone git@github.com:josdejong/mathjs.git
cd mathjs

安装项目依赖项

npm install

然后,可以通过执行 npm 中的构建脚本来构建项目

npm run build

这将构建 ESM 输出、CommonJS 输出,并从源文件打包 math.js,将其放在 lib 文件夹中。

开发

当为 mathjs 开发新功能时,了解以下背景信息很有帮助。

代码

mathjs 的代码是用 ES 模块编写的,并要求所有文件都有一个真实的相对路径,这意味着文件必须具有 *.js 扩展名。请配置您的 IDE 以在自动导入时添加文件扩展名。

架构

Math.js 努力实现的目标是提供一个环境,在这个环境中你可以使用混合数据类型进行计算,例如将一个常规的 number 与一个 Complex 数或一个 BigNumber 相乘,并在矩阵中使用所有这些。Mathjs 还允许以很小的努力添加新的数据类型。

Mathjs 使用的解决方案有两个主要成分

  • 类型函数。所有函数都是使用 typed-function 创建的。这使得动态创建和扩展单个函数以支持新的数据类型、在函数输入上自动执行类型转换等变得更加容易。因此,如果您为两个 number 创建了乘法函数,您可以扩展它以支持乘以您自己的数据类型,例如 MyDecimal。如果您定义了从 MyDecimalnumber 的转换,则类型函数将自动允许您将 MyDecimalnumber 相乘。

  • 依赖注入。当我们有一个支持 MyDecimal 的函数 multiply 时,得益于依赖注入,底层使用 multiply 的其他函数,如 prod,也将自动支持 MyDecimal。这同样适用于另一个方向:如果您不需要支持大数、矩阵等功能的重量级 multiply,而只需要简单的数字支持,您可以使用仅支持数字的轻量级 multiply 实现,并将其注入到 prod 和其他函数中。

在最低级别,mathjs 有不可变工厂函数,用于创建不可变函数。核心函数 math.create(...) 创建一个新实例,该实例包含从所有传入的工厂函数创建的函数。mathjs 实例是创建的函数集合。它包含一个如 math.import 的函数,用于允许扩展实例以包含新函数,这些函数可以用于表达式解析器。

实现新函数

一个常见的情况是实现一个新函数。这涉及到以下步骤

  • 在正确的类别中实现该函数,例如 ./src/function/arithmetic/myNewFunction.js,其中您可以替换 arithmetic 为适当的类别,并用 myNewFunction 替换新函数的名称。将新函数添加到索引文件 ./src/factoriesAny.js 和可能 ./src/factoriesNumber.js 中。
  • myNewFunction.js 的源代码注释中编写关于该函数的文档。此文档用于在网站上自动生成文档。
  • ./src/expression/embeddedDocs/function/arithmetic/myNewFunction.js 中编写新函数的嵌入式文档。将新文档添加到索引文件 ./src/expression/embeddedDocs/embeddedDocs.js 中。
  • ./test/unit-tests/function/arithmetic/myNewFunction.test.js 中编写该函数的单元测试。
  • ./types/index.d.ts 中编写新函数的必要 TypeScript 定义,并在 ./test/typescript-tests/testTypes.ts 中编写测试。这描述在 ./types/EXPLANATION.md 中。
  • 通过运行 npm run lint 确保代码风格正确(运行 npm run format 以自动修复代码风格)。

构建脚本

构建脚本目前生成两种类型的输出

  • any:生成入口点以创建所有函数的完整版本
  • number:生成入口点以创建仅支持 number 的轻量级函数

对于每个函数,都会生成一个包含该函数所有依赖项的工厂函数的对象。这允许只加载特定的函数集,而不会加载或捆绑任何其他功能。例如,要仅创建函数 add,可以执行 math.create(addDependencies)

测试

要执行库的测试,请先安装项目依赖项一次

npm install

然后,可以执行测试

npm test

要测试类型定义

npm run test:types

此外,可以使用 headless mode 在 Firefox 上运行测试

npm run test:browser

要在 BrowserStack 上远程运行测试,首先设置环境变量 BROWSER_STACK_USERNAMEBROWSER_STACK_ACCESS_KEY 为您的用户名和访问密钥,然后执行

npm run test:browserstack

虽然也可以单独运行代码检查器,但它在执行 npm test 时也会执行

npm run lint

要自动修复检查问题,请运行

npm run format

要测试测试的代码覆盖率

npm run coverage

要查看覆盖率结果,请打开浏览器中的生成报告

./coverage/lcov-report/index.html

持续集成测试

每次将提交推送到github时,都会在Github ActionsBrowserStack上运行持续集成测试。Github Actions运行不同版本的node.js测试,BrowserStack则在所有主要浏览器上运行测试。

BrowserStack

感谢Github Actions和BrowserStack为本开源项目提供慷慨的免费托管服务!

许可证

mathjs遵循Apache 2.0许可证发布

Copyright (C) 2013-2024 Jos de Jong <wjosdejong@gmail.com>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   https://apache.ac.cn/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

mathjs包含一个CSparse库的JavaScript版本,该库遵循LGPL-2.1+许可证发布

CSparse: a Concise Sparse matrix package.
Copyright (c) 2006, Timothy A. Davis.
http://www.suitesparse.com

--------------------------------------------------------------------------------

CSparse is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

CSparse is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this Module; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA