偏导数

Rya*_*yan 12 c++ algorithm math

我正在尝试编写一个能够执行N维混合偏导数的算法.我知道我需要能够实现什么,但我似乎无法想出实现N维情况所需的正确循环/递归.

以下是前4个维度的模式:

| 1D  wzyx  | 2D           | 3D           | 4D           |
----------------------------------------------------------
| dx (0001) | dx    (0001) | dx    (0001) | dx    (0001) |
|           | dy    (0010) | dy    (0010) | dy    (0010) |
|           | dyx   (0011) | dyx   (0011) | dyx   (0011) |
|           |              | dz    (0100) | dz    (0100) |
|           |              | dzx   (0101) | dzx   (0101) |
|           |              | dzy   (0110) | dzy   (0110) |
|           |              | dzyx  (0111) | dzyx  (0111) |
|           |              |              | dw    (1000) |
|           |              |              | dwx   (1001) |
|           |              |              | dwy   (1010) |
|           |              |              | dwyx  (1011) |
|           |              |              | dwz   (1100) |
|           |              |              | dwzx  (1101) |
|           |              |              | dwzy  (1110) |
|           |              |              | dxyzw (1111) |
Run Code Online (Sandbox Code Playgroud)

每个维度的导数(因为它遵循二元模式)是(2 ^ dim)-1; 例如,2 ^ 3 = 8-1 = 7.

dyx的导数是y维中相邻点的dx值.这适用于所有混合部分.因此dzyx是z维度中相邻点的dyx.我不确定这段是否是这个问题的相关信息,我想我已经在这里说完了.

欢迎任何帮助指针建议.粗体部分是我需要意识到的部分.

::编辑::

我将通过提供一个我需要的例子来尝试更加明确.这只是一个2D案例,但它可以说明我认为的整个过程.

我需要帮助提出将在列dx,dy,dyx等中生成值的算法.人.

|  X  |  Y  | f(x, y) |  dx             |  dy       | dyx               |
-------------------------------------------------------------------------
|  0  |  0  |    4    |  (3-4)/2 = -0.5 |  (3-4)/2  | (-0.5 - (-2.0))/2 |
|  1  |  0  |    3    |  (0-4)/2 = -2.0 |  (2-3)/2  | (-2.0 - (-2.0))/2 |
|  2  |  0  |    0    |  (0-3)/2 = -1.5 | (-1-0)/2  | (-1.5 - (-1.5))/2 |
|  0  |  1  |    3    |  (2-3)/2 = -0.5 |  (0-4)/2  | (-0.5 - (-0.5))/2 |
|  1  |  1  |    2    | (-1-3)/2 = -2.0 | (-1-3)/2  | (-1.5 - (-2.0))/2 |
|  2  |  1  |   -1    | (-1-2)/2 = -1.5 | (-4-0)/2  | (-1.5 - (-1.5))/2 |
|  0  |  2  |    0    | (-1-0)/2 = -0.5 |  (0-3)/2  | (-0.5 - (-0.5))/2 |
|  1  |  2  |   -1    | (-4-0)/2 = -2.0 | (-1-2)/2  | (-2.0 - (-2.0))/2 |
|  2  |  2  |   -4    |(-4--1)/2 = -1.5 |(-4--1)/2  | (-1.5 - (-1.5))/2 |
Run Code Online (Sandbox Code Playgroud)

f(x,y)未知,只知道其值; 因此,分析区分是没有用的,它必须只是数字.

欢迎任何帮助指针建议.粗体部分是我需要意识到的部分.

::编辑 - 再次::

在这里开始了一个要点:https://gist.github.com/1195522

vha*_*lac 2

如果我理解正确的话,我认为以下方法可行:

function partial_dev(point, dimension):
    neighbor_selector = top_bit(dimension)
    value_selector = dimension XOR neighbor_selector
    prev_point = point_before(point,neighbor_selector)
    next_point = pointafter(point,neighbor_selector)
    if value_selector == 0:
        return (f[prev_point] - f[next_point])/2
    else:
        return ( partial_dev(prev_point, value_selector) -
                 partial_dev(next_point, value_selector) )/2
Run Code Online (Sandbox Code Playgroud)

这个想法是:尺寸值的最高位是选择之前和之后点的坐标。如果其余尺寸值为 0,则使用f该点的值进行偏导数计算。如果不是,您将获得其余位表示的偏导数来计算值。

如果您需要计算所有维度值的所有值,那么您根本不需要递归:只需使用维度选择器作为数组索引,其中每个数组元素包含该维度的完整值集。该数组被初始化为vals[0][coords] = f(coords). 然后计算vals[1], vals[2],并且在计算 时vals[3],使用vals[1]代替值表vals[0](因为 3 = 0b11,其中邻居选择器是0b10, value_selector 是0b01)。