Octave函数包括用于计算多个变量函数的积分的几个函数。此过程通常可以通过创建一个先积分x,然后积分y的f函数来执行。可以使用以下积分函数的示例手动执行此过程:
f(x, y) = sin(pi*x*y) * sqrt(x*y)
对于x和y介于0和1之间。
下面的示例使用quadgk
,可以执行二重积分。(注意,除以下情况外,任何一维正交函数都可以以quad
这种方式使用,因为它是用Fortran编写的,不能递归调用。)
function q = g(y) q = ones (size (y)); for i = 1:length (y) f = @(x) sin (pi*x.*y(i)) .* sqrt (x.*y(i)); q(i) = quadgk (f, 0, 1); endfor endfunction I = quadgk ("g", 0, 1) ⇒ 0.30022
上面的算法在dblquad
函数中实现,用于两个变量的积分。此过程的三维等效程序在triplequad
中实现,用于三个变量的积分。例如,可以通过调用dblquad
来复现上面的结果,如下所示。
I = dblquad (@(x, y) sin (pi*x.*y) .* sqrt (x.*y), 0, 1, 0, 1) ⇒ 0.30022
q =
dblquad (f, xa, xb, ya, yb)
¶q =
dblquad (f, xa, xb, ya, yb, tol)
¶q =
dblquad (f, xa, xb, ya, yb, tol, quadf)
¶q =
dblquad (f, xa, xb, ya, yb, tol, quadf, …)
¶f的二重积分的数字求值.
f是一个函数句柄、内联函数或字符串,其中包含要计算的函数的名称。函数f必须具有z=f(x,y)形式,这里的x是一个向量,并且y是标量。它应该返回一个长度和方向与x相同的向量.
xa, ya和xb, yb分别是x和y的积分下限和上限。基础积分器决定是否接受其无穷边界。
可选参数tol定义用于积分每个子积分的绝对误差范围。默认值为1e-6。
可选参数quadf指定要使用的底层积分器函数。别无选择,但quad
可用,而默认值为quadcc
.
其他参数,直接传递给f。要使用tol或quadf的默认值,就传入':'
和空矩阵([])。
详见: integral2, integral3, triplequad, quad, quadv, quadl, quadgk, quadcc, trapz.
q =
triplequad (f, xa, xb, ya, yb, za, zb)
¶q =
triplequad (f, xa, xb, ya, yb, za, zb, tol)
¶q =
triplequad (f, xa, xb, ya, yb, za, zb, tol, quadf)
¶q =
triplequad (f, xa, xb, ya, yb, za, zb, tol, quadf, …)
¶f的三重积分的数字求值.
f是一个函数句柄、内联函数或字符串,其中包含要计算的函数的名称。函数f必须具有w=f(x,y,z)形式,其中任一x或y是一个向量,剩余的输入是标量。它应该返回一个长度和方向与x或y相同的向量.
xa, ya, za和xb, yb, zb分别是x、y和z的积分的下限和上限。基础积分器决定是否接受无穷边界。
可选参数tol定义用于积分每个子积分的绝对误差范围。默认值为1e-6。
可选参数quadf指定要使用的底层积分器函数。别无选择,但quad
可用,而默认值为quadcc
.
其他参数,直接传递给f。要使用tol或quadf的默认值,就传入':'
和空矩阵([])。
详见: integral3, integral2, dblquad, quad, quadv, quadl, quadgk, quadcc, trapz.
上面提出的用于求积的递归算法被称为"iterated"
。在函数quad2d
中实现了单独的二维积分方法。此函数执行"tiled"
通过将积分域细分为矩形区域并在这些区域上执行单独的积分来进行积分。将域进一步细分到需要细化的区域中,以达到所需的数值精度。对于某些函数,这种方法可能比上述其他函数中使用的二维迭代更快。
q =
quad2d (f, xa, xb, ya, yb)
¶q =
quad2d (f, xa, xb, ya, yb, prop, val, …)
¶[q, err, iter] =
quad2d (…)
¶f数值计算的二维积分。在从定义的二维域上使用自适应求积xa, xb,ya, yb使用平面积分。此外,ya和yb可以是x的标量函数,允许在非矩形区域上进行积分。
f是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。函数f必须具有z=f(x,y)形式,并且所有操作都必须向量化,以便x和y接受相同大小的数组输入并返回数组输出。(可以假设x和y要么是相同大小的数组,要么是标量。)底层积分器将把积分点数组输入到f和/或使用内部向量展开来加速计算,如果f不限于按元素操作。对于intergrand无法避免的情况,("Vectorized") option described below may produce
更可靠的结果。
可以使用指定其他可选参数property, value
对。有效属性为:
AbsTol
定义正交的绝对误差容限。默认值为1e-10(single是1e-5)。
RelTol
定义正交的相对误差容限。默认值为1e-6(single是1e-4)。
MaxFunEvals
对向量化函数的最大函数f的调用次数。默认值为5000。
Singular
启用/禁用变换以削弱积分域边缘的奇点。默认值为true.
Vectorized
启用或禁用向量化积分。值为false
将强制Octove在调用被积函数时仅使用标量输入,这将启用积分f(x,y)尚未向量化或仅接受x或y的标量值。默认值为true
。请注意,这是通过具有函数arrayfun
的软件包实现的f(x,y),这可能会显著降低计算速度。
FailurePlot
如果quad2d
未能在达到MaxFunEvals之前收敛到所需的误差容限,那么创建仍需要细化的区域图。默认值为false.
自适应求积用于最小化误差估计,直到满足以下条件:
error <= max (AbsTol, RelTol*|q|)
可选输出err是积分中误差的近似界abs (q - I)
,这里的I是积分的精确值。可选输出iter是对函数的向量化函数调用次数f使用的。
示例1:在x-y平面上积分矩形区域
f = @(x,y) 2*ones (size (x)); q = quad2d (f, 0, 1, 0, 1) ⇒ q = 2
结果是一个体积,对于这里的常值被积函数,它只是Length * Width * Height
.
示例2:在x-y平面上积分三角形区域
f = @(x,y) 2*ones (size (x)); ymax = @(x) 1 - x; q = quad2d (f, 0, 1, 0, ymax) ⇒ q = 1
结果是一个体积,对于这里的常值被积函数f2. ,是三角形面积x高度或1/2 * Base * Width * Height
.
示例3:在正方形区域上积分非向量化函数
f = @(x,y) sinc (x) * sinc (y)); q = quad2d (f, -1, 1, -1, 1) ⇒ q = 12.328 (incorrect) q = quad2d (f, -1, 1, -1, 1, "Vectorized", false) ⇒ q = 1.390 (correct) f = @(x,y) sinc (x) .* sinc (y); q = quad2d (f, -1, 1, -1, 1) ⇒ q = 1.390 (correct)
第一个结果不正确,因为函数f中的非按元素运算符在使用quad2d
的内部积分数组中创建了意外的矩阵乘法。在第二个结果中,设置"Vectorized"
为false使得quad2d
执行标量内部运算来计算积分,以增加约20倍的计算时间为代价,得到了正确的数值结果。在第三个结果中,对被积函数进行向量化f使用按元素乘法运算符可以在不增加计算时间的情况下获得正确的结果。
编程注意事项:如果积分区域内有奇点,最好将积分分解,并将奇点放在边界上。
已知MATLAB不兼容性:如果未指定误差范围,则所有积分极限都属于类型single
,则Octave的积分函数会自动降低上述默认的绝对和相对误差容限。如果需要更严格的误差范围,则必须指定误差范围。MATLAB对double
特别留出更严格的误差范围,不考虑积分极限类型。
参考文献:L.F.Shampine,MATLAB二维正交程序,《应用数学与计算》,第266–274页,2008年第1卷。
详见: integral2, dblquad, integral, quad, quadgk, quadv, quadl, quadcc, trapz, integral3, triplequad.
最后,函数integral2
和integral3
作为一般的二维和三重积分函数提供。它们将在迭代和平面积分方法之间进行自动选择,并且dblquad
和triplequad
用于非矩形积分域。
q =
integral2 (f, xa, xb, ya, yb)
¶q =
integral2 (f, xa, xb, ya, yb, prop, val, …)
¶[q, err] =
integral2 (…)
¶数值计算的二维积分f在从定义的二维域上使用自适应求积xa, xb,ya, yb(标量可以是有限的,也可以是无穷)。此外,ya和yb可以是的标量函数x,允许在非矩形区域上进行积分。
f是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。函数f必须具有形式z=f(x,y),并且所有操作都必须向量化,以便x和y接受相同大小的数组输入并返回数组输出。(可以假设x和y要么是相同大小的数组,要么是标量。)底层积分器将把积分点数组输入到f和/或使用内部向量展开来加速计算,如果f不限于按元素操作。对于intergrand无法避免的情况,("Vectorized") option described below may produce
更可靠的结果。
可以使用指定其他可选参数"property", value
对。有效属性为:
AbsTol
定义正交的绝对误差容限。默认值为1e-10(single是1e-5)。
RelTol
定义正交的相对误差容限。默认值为1e-6(single是1e-4)。
Method
指定要使用的二维积分方法,有效性为"auto"
默认"tiled"
或"iterated"
.使用时"auto"
,Octave将选择"tiled"
方法,除非任何积分极限是无穷。
Vectorized
启用或禁用向量化积分。的值false
forcesOctove在调用被积函数时仅使用标量输入,这将启用积分f(x,y)尚未向量化或仅接受的标量值x或y。默认值为true
。请注意,这是通过具有函数arrayfun
的软件包实现的f(x,y),这可能会显著降低计算速度。
自适应求积用于最小化误差估计,直到满足以下条件:
error <= max (AbsTol, RelTol*|q|)
err是积分误差的近似界abs (q - I)
这里的I是积分的确切值。
示例1:在x-y平面上积分矩形区域
f = @(x,y) 2*ones (size (x)); q = integral2 (f, 0, 1, 0, 1) ⇒ q = 2
结果是一个体积,对于这里的常值被积函数,它只是Length * Width * Height
.
示例2:在x-y平面上积分三角形区域
f = @(x,y) 2*ones (size (x)); ymax = @(x) 1 - x; q = integral2 (f, 0, 1, 0, ymax) ⇒ q = 1
结果是一个体积,对于这里的常值被积函数f2. ,是三角形面积x高度或1/2 * Base * Width * Height
.
示例3:在正方形区域上积分非向量化函数
f = @(x,y) sinc (x) * sinc (y)); q = integral2 (f, -1, 1, -1, 1) ⇒ q = 12.328 (incorrect) q = integral2 (f, -1, 1, -1, 1, "Vectorized", false) ⇒ q = 1.390 (correct) f = @(x,y) sinc (x) .* sinc (y); q = integral2 (f, -1, 1, -1, 1) ⇒ q = 1.390 (correct)
第一个结果不正确,因为函数f中的非按元素运算符在使用integral2
的内部积分数组中创建了意外的矩阵乘法。在第二个结果中,设置"Vectorized"
为false使得integral2
执行标量内部运算来计算积分,以增加约20倍的计算时间为代价,得到了正确的数值结果。在第三个结果中,对被积函数进行向量化f使用按元素乘法运算符可以在不增加计算时间的情况下获得正确的结果。
编程注意事项:如果积分区域内有奇点,最好将积分分解,并将奇点放在边界上。
已知MATLAB不兼容性:如果未指定误差范围,则所有积分极限都属于类型single
,则Octave的积分函数会自动降低上述默认的绝对和相对误差容限。如果需要更严格的误差范围,则必须指定误差范围。MATLAB留出更严格的误差范围double
输入到位,不考虑类的积分极限。
参考文献:L.F.Shampine,MATLAB二维正交程序,《应用数学与计算》,第266–274页,2008年第1卷。
详见: quad2d, dblquad, integral, quad, quadgk, quadv, quadl, quadcc, trapz, integral3, triplequad.
q =
integral3 (f, xa, xb, ya, yb, za, zb)
¶q =
integral3 (f, xa, xb, ya, yb, za, zb, prop, val, …)
¶对f的三重积分进行数值计算,在从xa, xb, ya, yb, za, zb定义的三维域上使用自适应求积(标量,可以是有限的或无穷)。此外,ya和yb可以是x的向量函数,并且za和zb可以是x和y的标量函数,允许在非矩形区域上进行积分。
f是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。函数f必须具有形式z=f(x,y,z),并且所有操作都必须向量化,以便x, y和z接受相同大小的数组输入并返回数组输出。(可以假设x, y和z将是相同大小的数组或标量。)底层积分器将积分点数组输入到f和/或使用内部向量展开来加速计算,如果f不限于按元素操作。对于intergrand不可避免的被积函数("Vectorized") option
下面描述的可以返回更可靠的结果。
可以使用指定其他可选参数"property", value
对。有效属性为:
AbsTol
定义正交的绝对误差容限。默认值为1e-10(single是1e-5)。
RelTol
定义正交的相对误差容限。默认值为1e-6(single是1e-4)。
Method
指定要使用的二维积分方法,有效性为"auto"
默认"tiled"
或"iterated"
.使用时"auto"
,Octave将选择"tiled"
方法,除非任何积分极限是无穷。
Vectorized
启用或禁用向量化积分。的值false
forcesOctove在调用被积函数时仅使用标量输入,这将启用积分f(x,y,z)尚未向量化或仅接受的标量值x, y或z。默认值为true
。请注意,这是通过具有函数arrayfun
的软件包实现的f(x,y),这可能会显著降低计算速度。
自适应求积用于最小化误差估计,直到满足以下条件:
error <= max (AbsTol, RelTol*|q|)
err是积分误差的近似界abs (q - I)
这里的I是积分的确切值。
示例1:在矩形体积上积分
f = @(x,y,z) ones (size (x)); q = integral3 (f, 0, 1, 0, 1, 0, 1) ⇒ q = 1.00000
对于这里的常值被积函数,结果是一个体积Length * Width * Height
.
示例2:在球形体积上积分
f = @(x,y) ones (size (x)); ymax = @(x) sqrt (1 - x.^2); zmax = @(x,y) sqrt (1 - x.^2 - y.^2); q = integral3 (f, 0, 1, 0, ymax, 0, zmax) ⇒ q = 0.52360
对于这里的常值被积函数,结果是体积,它是单位球面的1/8,或者1/8 * 4/3 * pi
.
示例3:在立方体积上积分非向量化函数
f = @(x,y) sinc (x) * sinc (y), * sinc (z); q = integral3 (f, -1, 1, -1, 1, -1, 1) ⇒ q = 14.535 (incorrect) q = integral3 (f, -1, 1, -1, 1, -1, 1, "Vectorized", false) ⇒ q = 1.6388 (correct) f = @(x,y,z) sinc (x) .* sinc (y), .* sinc (z); q = integral3 (f, -1, 1, -1, 1, -1, 1) ⇒ q = 1.6388 (correct)
第一个结果不正确,因为函数f中的非按元素运算符在使用integral3
的内部积分数组中创建了意外的矩阵乘法。在第二个结果中,设置"Vectorized"
为false使得integral3
执行标量内部运算来计算积分,以增加约30倍的不计算时间为代价,得到正确的数值结果。在第三个结果中,对被积函数进行向量化f使用按元素乘法运算符可以在不增加计算时间的情况下获得正确的结果。
编程注意事项:如果积分区域内有奇点,最好将积分分解,并将奇点放在边界上。
已知MATLAB不兼容性:如果未指定误差范围,则所有积分极限都属于类型single
,则Octave的积分函数会自动降低上述默认的绝对和相对误差容限。如果需要更严格的误差范围,则必须指定误差范围。MATLAB留出更严格的误差范围double
输入到位,不考虑类的积分极限。
参考文献:L.F.Shampine,MATLAB二维正交程序,《应用数学与计算》,第266–274页,2008年第1卷。
详见: triplequad, integral, quad, quadgk, quadv, quadl, quadcc, trapz, integral2, quad2d, dblquad.
上面的积分可能相当慢,而且这里的问题随着积分的维数而增加。二维积分的另一种可能的解决方案是使用上一节中描述的正交配置(详见正交配置). 函数的积分f(x,y)对于x和y可以用值n积分再除以i=1:n
和j=1:n
的总和来近似0和1之间的积分,积分区域为q(i)*q(j)*f(r(i),r(j))
,这里的q和r从colloc (n)
返回。对两个以上变量的推广是直接的。以下代码使用n=8个点计算积分。
f = @(x,y) sin (pi*x*y') .* sqrt (x*y'); n = 8; [t, ~, ~, q] = colloc (n); I = q'*f(t,t)*q; ⇒ 0.30022
应该注意的是,点的数量决定了近似的质量。如果需要在a和b,而不是0和1,则需要更改变量。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2