【问题标题】:Simulating interpolation on Brownian motion with Julia使用 Julia 模拟布朗运动的插值
【发布时间】:2021-10-15 05:07:48
【问题描述】:

我正在尝试插入布朗运动。该函数没有返回错误,但似乎 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)

非常感谢!

【问题讨论】:

  • 您能否也发布您将初始值分配给BM 的代码部分以及您如何调用interpolation 方法?
  • 我对递归函数的理解很差,但有一点看不出来。通常,递归函数有 >=1 个条件分支,您不会在其中递归调用该函数,也就是 基本情况。您的代码只有 1 个执行递归的分支,因此隐式基本情况是将 if 语句跳过到函数末尾,这将返回 nothing。也许nothing 正在通过您的递归调用进行传播?这不是 MWE,所以我们无法找到自己。
  • @BatWannaBe 这是一种非常标准的递归方式来生成分形。这个想法是函数副作用 BM。
  • @Ted Dunning 我明白了,所以大部分工作都在BM[d]=... 行中完成,并且递归调用正在循环回它。在那种情况下,我很惊讶没有错误,因为第一个递归调用在改变Vector 后将BM 重新分配给基本情况nothing,所以第二个递归调用将尝试BM=interpolation(d,j,N,nothing)
  • @BatWannaBe 请参阅我的单独答案,了解如何避免您遇到的问题。关键是每个递归调用都有自己的指向数组的指针。我的回答还使用了@view,因此我正在处理的数组的哪一部分的维护由 Julia 自己处理。

标签: julia interpolation


【解决方案1】:

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

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

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. 如果我们没有足够大的数组,就返回

这种方法避免了所有的内务处理使图片变得复杂,而且它第一次尝试就奏效了,主要是因为,我认为,我不必把所有的东西都整理好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 2011-08-12
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多