首页 > 解决方案 > 使用 Julia 模拟布朗运动的插值

问题描述

我正在尝试插入布朗运动。该函数没有返回错误,但似乎 Julia 没有将值放在向量 B 上。这里是代码。

function interpolation(i,j,N,BM) 
       if j-i>1
       k = sqrt((j-i)/((2^N))/4)
       d = (i+j)/2
       BM[d] =((BM[i]+BM[j])/2)+k*randn(1)
       BM = interpolation(i,d,N,BM)
       BM = interpolation(d,j,N,BM)
       end
       end

plot(BM)

非常感谢!

标签: juliainterpolation

解决方案


我认为您的代码可以通过使用数组视图来简化。这消除了代码中的所有额外参数,并且更容易看到它在做什么。标准化使得内部步骤的变化更小也可以被简化。

所以这里是对这个简化的尝试:

function fractal(x) 
    if length(x) > 2
        n = length(x)
        mid = (n+1)÷2
        x[mid] = (x[1] + x[n])/2 + randn() * sqrt(n)
        fractal(@view x[1:mid])
        fractal(@view x[mid:n])
    end
end

这是此代码运行的结果:

a = zeros(1024)
fractal(a)
plot(a, legend=false)

产生的分形图

简化的重点是强调算法涉及的思想:

  1. 根据端点插值中间值
  2. 对数组的左半部分和右半部分执行相同的操作
  3. 如果我们没有足够大的数组,就返回

这种方法避免了所有家务处理使图片复杂化,并且它第一次尝试就奏效了,主要是因为,我认为,我不必保持所有这些东西直截了当。


推荐阅读