You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:06:01