Back

# 数学函数

## 基本函数

### 基本一元数学函数

Maths.sqrt 2.
>- : float = 1.41421356237309515


[@tbl:maths:basic_unary] 列出了在该模块中支持的这些一元函数。

abs |x|
neg -x
reci 1/x
floor the largest integer that is smaller than x
ceil the smallest integer that is larger than x
round rounds x towards the bigger integer when on the fence
trunc integer part of x
sqr $$x^2$$
sqrt $$\sqrt{x}$$

### 基本二元数学函数

add x + y
sub x - y
mul x * y
div x / y
fmod x % y
pow $$x^y$$
hypot $$\sqrt{x^2 + y^2}$$
atan2 返回$$\arctan(y/x)$$，考虑参数的符号；这是向量$$(x, y)$$相对于 x 轴的角度。

### 指数和对数函数

$e^{i\pi}+ 1=0.$

exp 指数函数$$e^x$$
exp2 $$2^x$$
exp10 $$10^x$$
expm1 返回$$\exp(x) - 1$$，但对于$$x \sim 0$$更精确
log $$\log_e~x$$
log2 $$\log_2~x$$
log10 $$\log_{10}~x$$
logn $$\log_n~x$$
log1p 逆函数expm1
logabs $$\log(|x|)$$
xlogy $$x \log(y)$$
xlog1py $$x \log(y+1)$$
logit $$\log(p/(1-p))$$
expit $$1/(1+\exp(-x))$$
log1mexp $$\log(1-\exp(x))$$
log1pexp $$\log(1+\exp(x))$$

### 三角函数

Maths.sin (Owl_const.pi /. 2.)
>- : float = 1.


sin $$\sin(x)$$ $$\cos(x)$$ $$\sum_{n=1}(-1)^{n+1}\frac{x^{2n+1}}{(2n+1)!}$$
cos $$\cos(x)$$ $$-\sin(x)$$ $$\sum_{n=1}(-1)^n\frac{x^{2n}}{(2n)!}$$
tan $$\tan(x)$$ $$1 + \tan^2(x)$$ $$\sum_{n=1}\frac{4^n(4^n-1)B_n~x^{2n-1}}{(2n)!}$$
cot $$1/\tan(x)$$ $$-(1 + \textrm{cot}^2(x))$$ $$\sum_{n=0}\frac{E_n~x^{2n}}{(2n)!}$$
sec $$1/\cos(x)$$ $$\textrm{sec}(x)\tan(x)$$ $$\sum_{n=0}\frac{2(2^{2n-1})B_n~x^{2n-1}}{(2n)!}$$
csc $$1/\sin(x)$$ $$-\textrm{csc}(x)\textrm{cot}(x)$$ $$\frac{1}{x}-\sum_{n=1}\frac{4^n~B_n~x^{2n-1}}{(2n)!}$$

• sinh: $$\frac{e^x - e^{-x}}{2}$$, derivative is $$\cosh(x)$$, and taylor expansion is $$\sum_{n=0}\frac{x^{2n+1}}{(2n+1)!}$$.
• cosh: $$\frac{e^x + e^{-x}}{2}$$, derivative is $$\sinh(x)$$, and taylor expansion is $$\sum_{n=0}\frac{x^{2n+1}}{(2n+1)!}$$.
• tanh: $$\frac{\sinh{x}}{\cosh{x}}$$, derivative is $$1-\tanh^2(x)$$, and taylor expansion is $$\sum_{n=1}\frac{4^n(4^n-1)B_{2n}~x^{2n-1}}{(2n)!}$$.
• coth: $$\frac{\cosh{x}}{\sinh{x}}$$, derivative is $$1-\coth^2(x)$$, and taylor expansion is $$\frac{1}{x}-\sum_{n=1}\frac{4^n~B_{2n}~x^{2n-1}}{(2n)!}$$.
• sech: $$1/\cosh(x)$$, derivative is $$-\tanh(x)/\cosh(x)$$, and taylor expansion is $$\sum_{n=0}\frac{E_{2n}~x^{2n}}{(2n)!}$$.
• csch:$$1/\sinh(x)$$, derivative is $$-\coth(x)/\sinh(x)$$, and taylor expansion is $$\frac{1}{x}+\sum_{n=1}\frac{2(1-2^{2n-1})B_{2n}~x^{2n-1}}{(2n)!}$$.

### 其他数学函数

• sigmoid x: $$1 / (1 + \exp(-x))$$
• signum x: 返回 x 的符号：-1、0 或 1
• softsign x: 平滑 sign 函数
• relu x: $$\max(0, x)$$

## 特殊函数

### 艾里函数

$y''(x) = xy(x).$

val airy : float -> float * float * float * float

let x = Mat.linspace (-15.) 5. 200

let y0 = Mat.map (fun x ->
let ai, _, _, _ = Maths.airy x in ai
) x

let y1 = Mat.map (fun x ->
let _, _, bi, _ = Maths.airy x in bi
) x

let _ =
let h = Plot.create "special_airy.png" in
Plot.(plot ~h ~spec:[ RGB (66, 133, 244); LineStyle 1; LineWidth 2. ] x y0);
Plot.(plot ~h ~spec:[ RGB (219, 68,  55); LineStyle 2; LineWidth 2. ] x y1);
Plot.(set_yrange h (-0.5) 1.);
Plot.(legend_on h ~position:SouthEast [|"Ai"; "Bi"|]);
Plot.output h

### 贝塞尔函数

$x^2y''+xy'+(x^2 - \alpha^2)y = 0.$

j0 x 零阶第一类贝塞尔函数
j1 x 一阶第一类贝塞尔函数
jv x y 实阶第一类贝塞尔函数
y0 x 零阶第二类贝塞尔函数
y1 x 一阶第二类贝塞尔函数
yv x y 实阶第二类贝塞尔函数
yn a x 整数阶第二类贝塞尔函数
i0 x 零阶修改贝塞尔函数
i1 x 一阶修改贝塞尔函数
iv x y 实阶修改贝塞尔函数
i0e x 零阶指数缩放修改贝塞尔函数
i1e x 一阶指数缩放修改贝塞尔函数
k0 x 零阶第二类修改贝塞尔函数
k1 一阶第二类修改贝塞尔函数
k0e 零阶指数缩放第二类修改贝塞尔函数
k1e 一阶指数缩放第二类修改贝塞尔函数

### 椭圆函数

Jacobi椭圆函数用于研究摆动运动。共有十二个Jacobi椭圆函数，而我们在这里包括的ellipj返回其中三个：sncndn。该函数的第四个输出phi被称为输入u的振幅。

ellipj u m 参数m在0和1之间，实参数u的Jacobi椭圆函数
ellipk m 完全椭圆积分的第一类
ellipkm1 p 围绕m = 1的完全椭圆积分的第一类
ellipkinc phi m 第一类不完全椭圆积分
ellipe m 完全椭圆积分的第二类
ellipeinc phi m 第二类不完全椭圆积分

let a = 4.
>val a : float = 4.
let b = 3.
>val b : float = 3.
let c = 4. *. a *. Maths.(ellipe (1. -. pow (b /. a) 2.))
>val c : float = 22.1034921607095072


### 伽玛函数

$\Gamma(n) = (n-1)!$

$\Gamma(z) = \int_0^{\infty}x^{z-1}e^{-x}dx.$

gamma z 返回 Gamma 函数的值
rgamma z Gamma 函数的倒数
loggamma z Gamma 函数对数的主支
gammainc a x 正则化的下不完全 Gamma 函数
gammaincinv a y gammainc 的反函数
gammaincc a x 补充不完全 Gamma 积分
gammainccinv a y gammaincc 的反函数
psi z digamma 函数

let x = Mat.linspace (-3.5) 5. 2000

let y = Mat.map Maths.gamma x

let _ =
let h = Plot.create "example_gamma.png" in
Plot.(plot ~h ~spec:[ RGB (66, 133, 244); LineStyle 1; LineWidth 2. ] x y);
Plot.(set_yrange h (-10.) 20.);
Plot.output h

### Beta 函数

Beta 函数定义为：

$B(x,y) = \int_0^1t^{x-1}(1-t)^{y-1}dt = \frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)}$

$B(x, a, b) = \int_0^xt^{a-1}(1-t)^{b-1}dt.$

Beta 函数有几个属性。例如，下面的代码显示了 beta 函数和 gamma 函数之间的关系。

let x = Maths.beta 3. 4.
>val x : float = 0.0166666666666666664
let y = Maths.((gamma 3.) *. (gamma 4.) /. (gamma (7.)))
>val y : float = 0.0166666666666666664


let x = Maths.beta 3. 4.
>val x : float = 0.0166666666666666664
let y = Maths.beta 4. 3.
>val y : float = 0.0166666666666666664


### 斯特鲁夫函数

Owl函数struve v x返回斯特鲁夫函数的值。参数$$v$$被称为此函数的。以下是显示阶从0到4的斯特鲁夫函数曲线的示例。

let _ =
let h = Plot.create "example_struve.png" in
Plot.(plot_fun ~h ~spec:[ RGB (66, 133, 244); LineStyle 1; LineWidth 2.] (Maths.struve 0.) (-12.) 12.);
Plot.(plot_fun ~h ~spec:[ RGB (219, 68,  55); LineStyle 2; LineWidth 2.] (Maths.struve 1.) (-12.) 12.);
Plot.(plot_fun ~h ~spec:[ RGB (244, 180,  0); LineStyle 3; LineWidth 2.] (Maths.struve 2.) (-12.) 12.);
Plot.(plot_fun ~h ~spec:[ RGB (77,  81,  57); LineStyle 1; LineWidth 2.] (Maths.struve 3.) (-12.) 12.);
Plot.(plot_fun ~h ~spec:[ RGB (111, 51, 129); LineStyle 2; LineWidth 2.] (Maths.struve 4.) (-12.) 12.);
Plot.(set_yrange h (-3.) 5.);
Plot.(legend_on h ~position:SouthEast [|"H0"; "H1"; "H2"; "H3"; "H4"|]);
Plot.output h

### ζ函数

$\zeta(x, q) = \sum_{k=0}^{\infty}\frac{1}{(k+q)^x}.$

$$q$$设置为1时，该函数缩减为黎曼 zeta 函数。函数zetac x返回黎曼 zeta 函数减1。ζ函数经常用于分析动态系统。此外，黎曼 zeta 函数在数论中发挥重要作用，并在量子物理、概率论和应用统计学等广泛应用。

Maths.zeta 4. 1.
>- : float = 1.08232323371113837
(Maths.pow Owl_const.pi 4.) /. 90.
>- : float = 1.08232323371113792


### 误差函数

erf x 误差函数
erfc x 补充误差函数：$$1 - \textrm{erf}(x)$$
erfcx x 缩放的补充误差函数：$$\exp(x^2) \mathrm{erfc}(x)$$
erfinv x 误差函数的反函数
erfcinv x 补充误差函数的反函数

let _ =
let h = Plot.create "example_erf.png" in
Plot.(plot_fun ~h ~spec:[ RGB (66, 133, 244); LineStyle 1; LineWidth 2.] Maths.erf (-3.) 3.);
Plot.output h

### 积分函数

let _ =
let h = Plot.create ~m:1 ~n:2 "example_integrals.png" in
Plot.subplot h 0 0;
Plot.(plot_fun ~h ~spec:[ RGB (66, 133, 244); LineStyle 1; LineWidth 2.] Maths.dawsn (-5.) 5.);
Plot.set_ylabel h "dawsn(x)";
Plot.subplot h 0 1;
Plot.(plot_fun ~h ~spec:[ RGB (66, 133, 244); LineStyle 1; LineWidth 2.] (fun x -> let s, _ = Maths.fresnel x in s) 0. 5.);
Plot.(plot_fun ~h ~spec:[ RGB (219, 68,  55); LineStyle 2; LineWidth 2.] (fun x -> let _, c = Maths.fresnel x in c) 0. 5.);
Plot.(legend_on h ~position:SouthEast [|"S(x)"; "C(x)"|]);
Plot.set_ylabel h "fresnel(x)";
Plot.output h

expn n x 广义指数积分 $$E_n(x) = x^{n-1}\int_x^{\infty}\frac{e^{-t}}{t^n}dt$$
shi x 双曲正弦积分：$$\int_0^x~\frac{\sinh~t}{t}dt$$
chi x 双曲余弦积分：$$\gamma + \log(x) + \int_0^x~\frac{\cosh~t -1}{t}dt$$
shichi x (shi x, chi x)
si x 正弦积分：$$\int_0^x~\frac{\sin~t}{t}dt$$
ci x 余弦积分：$$\gamma + \log(x) + \int_0^x~\frac{\cos~t -1}{t}dt$$
sici x (si x, ci x)

## 阶乘

$$F(n) = n! = n \times (n - 1) \times (n-2) \ldots \times 1$$

fact n 阶乘函数$$!n$$
log_fact n 阶乘函数的对数
doublefact n 双阶乘函数计算$$n!! = n(n-2)(n-4)\dots 2$$（或 1）
log_doublefact n 双阶乘函数的对数

Maths.fact 5
>- : float = 120.


permutation n k 排列数
permutation_float n k 类似于permutation，但处理更大范围并返回浮点数
combination n k 组合数
combination_float n k 类似于combination，但处理更大范围并返回浮点数
log_combination n k 返回$${n\choose k}$$的对数

let x = Maths.combination 10 2
>val x : int = 45
let y = Maths.combination_float 10 2
>val y : float = 45.


## 插值和外推

Owl_maths_interpolate模块提供了一个用于插值和外推的polint函数：

val polint : float array -> float array -> float -> float * float

let x = [|2; 3; 4; 5; 6|]
>val x : int array = [|2; 3; 4; 5; 6|]
let y = Array.map (fun x -> Maths.fact (x - 1)) x
>val y : float array = [|1.; 2.; 6.; 24.; 120.|]
let x = Array.map float_of_int x
>val x : float array = [|2.; 3.; 4.; 5.; 6.|]


## 积分

$\int_a^bf(x)dx$

Owl_maths_quandrature模块中，Owl提供了几种数值例程，以帮助您进行积分。例如，我们可以使用以下代码计算$$\int_1^4x^2$$

Owl_maths_quadrature.trapz (fun x -> x ** 2.) 1. 4.
>- : float = 21.0001344681758439


$\int_1^4x^2 = (4^3 -1^3) / 3 = 21$

$\int_{x_0}^{x_1}f(x)dx = h(\frac{f(x_0)}{2} + \frac{f(x_1)}{2}) + O(h^3f'').$

val trapz : ?n:int -> ?eps:float -> (float -> float) -> float -> float -> float

trapz ~n ~eps f a b使用梯形法计算f在区间[a,b]上的积分。它通过迭代多个阶段工作，每个阶段通过添加更多的内部点来提高准确性。参数$$n$$指定最大步数，默认为20，eps是所需的分数精度阈值，默认为1e-6

$\int_{x_0}^{x_2}f(x)dx = h(\frac{f(x_0)}{3} + \frac{4f(x_1)}{3} + \frac{f(x_2)}{3}) + O(h^5f(4)).$




 
 实用函数 除了我们到目前为止提到的内容之外，还有一些值得一提的实用数学函数。 我们知道，质数是大于1的自然数，不能通过两个较小的自然数相乘而得到。这是信息技术中的一个关键概念，广泛应用于公钥密码学等应用。函数is_prime检查整数是否为质数。该函数对所有能由整数表示的数字都是确定性的。它是使用Miller-Rabin素性测试方法实现的。 Maths.is_prime 997 >- : bool = true 另一个与数论相关的概念是费马因子分解，它将奇整数表示为两个平方的差：$$N = a^2 - b^2$$，因此N可以分解为$$(a+b)(a-b)$$。函数fermat_fact对奇数N执行费马因子分解，即分解为两个大致相等的因子$$x$$和$$y$$，使得$$N=x\times~y$$。 Maths.fermat_fact 6557 >- : int * int = (83, 79) 83 * 79 >- : int = 6557 接下来的两个函数涉及计算机中浮点数的精度。 nextafter from to返回from在to方向上的下一个可表示的双精度值。另一个函数nextafter from to返回from在to方向上的下一个可表示的单精度值。在两种情况下，如果from等于to，则返回此值本身。例如： Maths.nextafterf 1. 2.;; >- : float = 1.00000011920928955 Maths.nextafter 1. 2.;; >- : float = 1.00000000000000022 Maths.nextafter 1. 0.;; >- : float = 0.999999999999999889 总结 我们从我们熟悉的数学函数开始讨论数值计算的主题。本章介绍了 Owl 支持的数学函数，包括基本和常用函数、一些不太常用但仍然重要的特殊函数、阶乘、插值、外推、积分等。随时跳转到您感兴趣的任何部分，并使用这些函数解决手头的数学问题。您可能会发现 Owl 与任何其他数值库一样优秀的计算器。 
下一步：第05章统计函数隐私政策GitHub版权所有 2017-2023 梁旺。