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

如何在BVP定义中正确使用强迫项?solve_bvp维度错误排查

问题分析与解决

错误根源

报错ValueError: object too deep for desired array的核心原因是数组维度不匹配:

  • 定义的var是二维数组(形状(1, 50)),而np.interp要求传入的待插值数组是一维的,直接传入会导致插值结果维度异常。
  • 同时np.interp(x, x, var)中,x长度为100,var长度为50,参数长度不匹配,进一步加剧维度冲突。

修正步骤

1. 重构var为一维数组

将原本的二维var改为一维,匹配插值要求:

# 替代原var的定义
var = np.arange(int(num/2)) ** 2  # 直接生成x²形式的一维数组

2. 正确使用np.interp

由于var仅对应x ∈ [0, 0.5]区间的数据,插值时需明确指定对应的x坐标区间,再对目标区域赋值:

def fun(x, y):
    force = np.zeros_like(x)
    mask = x <= 1 - a  # 筛选需要应用强迫项的区域
    
    # 对mask区域的x值插值得到对应的var值
    var_interp = np.interp(x[mask], x[:len(var)], var)
    # 计算多项式值
    poly_val = np.polyval(p, y[0][mask])
    # 赋值给force的对应区域
    force[mask] = -poly_val * var_interp

    return np.vstack((y[1], y[2], y[3], force))

完整修正代码

from scipy.integrate import solve_bvp
import numpy as np

p = [1, 2]
a = 0.5
num = 100
x = np.linspace(0, 1, num)

# 重构为一维数组
var = np.arange(int(num/2)) ** 2

def fun(x, y):
    force = np.zeros_like(x)
    mask = x <= 1 - a
    
    var_interp = np.interp(x[mask], x[:len(var)], var)
    poly_val = np.polyval(p, y[0][mask])
    force[mask] = -poly_val * var_interp

    return np.vstack((y[1], y[2], y[3], force))

def bc(ya, yb):
    return np.array([ya[0], ya[1], yb[0]-1, yb[2]])

y_guess = 0*np.ones((4, x.size))
res = solve_bvp(fun, bc, x, y_guess)

关键说明

  • 确保所有参与运算的数组维度一致:solve_bvp要求fun返回的数组形状为(4, len(x)),因此force必须是一维数组(长度与x一致)。
  • 分段强迫项通过mask筛选区域,避免维度不匹配的赋值操作。

内容的提问来源于stack exchange,提问作者Mechanician

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:10