使用Julia模拟布朗运动插值时BM向量赋值异常问题求助
问题排查及修复方案
你代码中的问题主要有以下几个:
- 函数无有效返回值:Julia函数默认返回最后一行执行的表达式结果,当
j-i<=1时,你没有显式返回BM,递归调用会返回nothing,你后续用BM = interpolation(...)的写法会把原本指向数组的局部变量BM覆盖为nothing,导致之前的修改失效。 - 索引类型错误:你通过
(i+j)/2计算得到的d是浮点类型,Julia原生向量不支持浮点数作为索引,你需要改用整数除法÷得到整数类型的索引。 - 赋值类型不兼容:
randn(1)返回的是长度为1的数组,直接赋值给BM向量的单个元素会出现类型不兼容问题,应该改用randn()返回标量值。 - 没有实际调用插值函数:你给出的代码仅定义了
interpolation函数,没有执行调用逻辑,自然不会修改BM向量的初始值。 - 不必要的数组重赋值:Julia的数组是可变引用类型,你原地修改
BM[d]的操作本身就会作用到原数组上,不需要再把递归调用的返回值重新赋值给BM。
修复后的参考代码
using Plots # 插值函数实现 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() interpolation(i, d, N, BM) interpolation(d, j, N, BM) end return BM # 显式返回修改后的数组 end # 初始化参数和BM向量 N = 8 total_points = 2^N + 1 BM = zeros(total_points) # 布朗运动初始端点设置,这里设BM[1]=0,BM[end]为正态分布抽样,也可自定义 BM[end] = sqrt(total_points-1)*randn() # 调用插值函数 interpolation(1, total_points, N, BM) # 绘图 plot(BM, label="Brownian Motion", xlabel="Step", ylabel="Value")
补充说明
如果需要固定布朗运动的起点和终点,直接修改初始化时BM[1]和BM[end]的赋值即可,不需要修改插值逻辑。
内容的提问来源于stack exchange,提问作者Marco Piazza
相关产品推荐
相关产品推荐

