23.3多变量函数

Octave函数包括用于计算多个变量函数的积分的几个函数。此过程通常可以通过创建一个集成的函数来执行f关于x,然后积分关于的函数y。可以使用以下集成函数的示例手动执行此过程:

f(x, y) = sin(pi*x*y) * sqrt(x*y)

对于xy介于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, yaxb, yb分别是x和y的积分下限和上限。基础积分器决定是否接受其无限边界。

可选参数tol定义用于积分每个子积分的绝对误差范围。默认值为1e-6。

可选参数quadf指定要使用的底层积分器函数。别无选择,但quad可用,而默认值为quadcc.

其他参数,直接传递给f。使用的默认值tolquadf可以通过':'或emptymatrix([])。

详见: 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)其中任一xy是一个向量,其中剩余的输入是标量。它应该返回一个长度和方向与相同的向量xy.

xa, ya, zaxb, yb, zb分别是x、y和z的积分的下限和上限。基础积分器决定是否接受无限边界。

可选参数tol定义用于积分每个子积分的绝对误差范围。默认值为1e-6。

可选参数quadf指定要使用的底层积分器函数。别无选择,但quad可用,而默认值为quadcc.

其他参数,直接传递给f。使用的默认值tolquadf可以通过':'或emptymatrix([])。

详见: 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使用平铺集成。此外,yayb可以是的标量函数x,允许在非矩形域上进行积分。

f是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。函数f必须为形式z=f(x,y),并且所有操作都必须向量化,以便xy接受相同大小的数组输入并返回数组输出。(可以假设xy要么是相同大小的数组,要么是标量。)底层积分器将把集成点数组输入到f和/或使用内部向量展开来加速计算,如果f不限于元素操作。对于可导航的被积函数("Vectorized") option described below may produce更可靠的结果。

可以使用指定其他可选参数"property", value对。有效属性为:

AbsTol

定义正交的绝对误差容限。默认值为1e-10(1e-5表示单个)。

广告
RelTol

定义正交的相对误差容限。默认值为1e-6(1e-4表示单个)。

广告
MaxFunEvals

对向量化函数的最大函数调用次数f。默认值为5000。

广告
Singular

启用/禁用变换以削弱积分域边缘的奇点。默认值为true.

广告
Vectorized

启用或禁用向量化集成。的值falseforcesOctove在调用被积函数时仅使用标量输入,这将启用积分f(x,y)尚未向量化或仅接受的标量值xy。默认值为true。请注意,这是通过软件包实现的f(x,y)具有函数arrayfun,这可能会显著降低计算速度。

广告
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)

第一个结果不正确,因为中nc函数之间的非元素运算符f在使用的内部积分数组之间创建意外的矩阵乘法quad2d。在第二个结果中,设置"Vectorized"虚假的力量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.

广告

最后,函数integral2integral3作为一般的二维和三维集成函数提供。它们将在迭代和平铺集成方法之间进行自动选择,与dblquadtriplequad,将用于非矩形集成域。

 
: q = integral2 (f, xa, xb, ya, yb)
: q = integral2 (f, xa, xb, ya, yb, prop, val, …)
: [q, err] = integral2 (…)

数值计算的二维积分f在从定义的二维域上使用自适应求积xa, xb,ya, yb(标量可以是有限的,也可以是无限的)。此外,yayb可以是的标量函数x,允许在非矩形域上进行集成。

f是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。函数f必须为形式z=f(x,y),并且所有操作都必须向量化,以便xy接受相同大小的数组输入并返回数组输出。(可以假设xy要么是相同大小的数组,要么是标量。)底层积分器将把集成点数组输入到f和/或使用内部向量展开来加速计算,如果f不限于元素操作。对于可导航的被积函数("Vectorized") option described below may produce更可靠的结果。

可以使用指定其他可选参数"property", value对。有效属性为:

AbsTol

定义正交的绝对误差容限。默认值为1e-10(1e-5表示单个)。

广告
RelTol

定义正交的相对误差容限。默认值为1e-6(1e-4表示单个)。

广告
Method

指定要使用的二维积分方法,有效性为"auto"默认"tiled""iterated".使用时"auto",Octave将选择"tiled"方法,除非任何积分极限是无限的。

广告
Vectorized

启用或禁用向量化集成。的值falseforcesOctove在调用被积函数时仅使用标量输入,这将启用积分f(x,y)尚未向量化或仅接受的标量值xy。默认值为true。请注意,这是通过软件包实现的f(x,y)具有函数arrayfun,这可能会显著降低计算速度。

广告

自适应求积用于最小化误差估计,直到满足以下条件:

        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)

第一个结果不正确,因为中nc函数之间的非元素运算符f在使用的内部积分数组之间创建意外的矩阵乘法integral2。在第二个结果中,设置"Vectorized"虚假的力量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(标量可能是有限的或无限的)。此外,yaybmay bescalar函数xzazb可能是的标量函数xy,允许在非矩形域上进行集成。

f是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。函数f必须为形式z=f(x,y,z),并且所有操作都必须向量化,以便x, yz接受相同大小的数组输入并返回数组输出。(可以假设x, yz将是相同大小的数组或标量。)底层积分器将积分点数组输入到f和/或使用内部向量展开来加速计算,如果f不限于元素操作。对于不可避免的被积函数("Vectorized") option下面描述的可以返回更可靠的结果。

可以使用指定其他可选参数"property", value对。有效属性为:

AbsTol

定义正交的绝对误差容限。默认值为1e-10(1e-5表示单个)。

广告
RelTol

定义正交的相对误差容限。默认值为1e-6(1e-4表示单个)。

广告
Method

指定要使用的二维积分方法,有效性为"auto"默认"tiled""iterated".使用时"auto",Octave将选择"tiled"方法,除非任何积分极限是无限的。

广告
Vectorized

启用或禁用向量化集成。的值falseforcesOctove在调用被积函数时仅使用标量输入,这将启用积分f(x,y,z)尚未向量化或仅接受的标量值x, yz。默认值为true。请注意,这是通过软件包实现的f(x,y,z)具有该函数arrayfun,这可能会显著降低计算速度。

广告

自适应求积用于最小化误差估计,直到满足以下条件:

        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)

第一个结果不正确,因为中nc函数之间的非元素运算符f在使用的内部积分数组之间创建意外的矩阵乘法integral3。在第二个结果中,设置"Vectorized"虚假的力量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)对于xy可以使用来近似0和1之间的值n积分除以总和i=1:nj=1:n属于q(i)*q(j)*f(r(i),r(j))这里的qr从返回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

应该注意的是,点的数量决定了近似的质量。如果需要在ab,而不是0和1,则需要更改变量。


版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2