ti.field(ti.f64, 8)定义一个变量,如何取出其中的值呢

我想用高斯数值积分的方法写一个积分试试,但是taichi似乎不支持类似numpy的切片,对于习惯了numpy操作的小白来说,不知道该怎么办了,求指点,下边是我写的代码

gauss_nodes = ti.field(ti.f64, 8)
gauss_weights = ti.field(ti.f64, 8)

gauss_nodes = [0.9602898565, -0.9602898565, 0.7966664774, -0.7966664774, 0.5255324099, -0.5255324099, 0.1834346425,
               -0.1834346425]
gauss_weights = [0.1012285363, 0.1012285363, 0.2223810345, 0.2223810345, 0.3137066459, 0.3137066459, 0.3626837834,
                 0.3626837834]

S = ti.field(ti.f64, ())

S[None] = 0.0


# 定义被积函数
@ti.func
def f1(x):
    return ti.sin(x)


@ti.kernel
def gauss_quad():
    a = 0.0
    b = 3.141592654
    s = 0.0
    for i in range(8):
        s += gauss_weights[i] * f1(gauss_nodes[i] * (b - a) / 2.0 + (b + a) / 2.0)
    S[None] = s * (b - a) / 2.0


gauss_quad()
print(S)

Hi @bambooname5070, 非常欢迎来到Taichi Lang中文论坛。

在你定义好field之后,用一个list来赋值会覆盖掉原来field的定义。推荐你用from_numpy 函数来初始化你的field,比如:

gauss_nodes = ti.field(ti.f64, 8)
gauss_nodes_np = np.asarray([0.9602898565, -0.9602898565, 0.7966664774, -0.7966664774, 0.5255324099, -0.5255324099, 0.1834346425,
               -0.1834346425])
gauss_nodes.from_numpy(gauss_nodes_np)

目前没看到你的代码里用到了slice操作,除了上面的问题,还有就是print(S)print(S[None]),其他的代码我觉得OK。

1 Like

非常感谢,根据提示,我已经决问题解决了