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

如何绘制依赖于二值时间函数的分段动态函数?

实现思路与代码示例

你的需求核心是基于原0/1状态函数,分段计算依赖前一段结果的红色曲线,以下是具体实现方案:

核心思路

因为红色曲线的计算依赖前一段的最终值t0,无法通过纯向量化操作一次性完成,必须按状态区间逐段计算并传递t0,步骤如下:

  • 提取原函数状态切换的时间点,将整个时间轴分割为连续的、状态一致的区间
  • 对每个区间,根据当前状态(0或1)使用对应公式计算曲线值
  • 更新t0为当前区间的最终值,用于下一段计算

完整代码实现

1. 生成原函数(蓝色曲线)

先将字符串格式的区间解析为数值,再生成0/1取值的原函数:

import numpy as np
import matplotlib.pyplot as plt

# 替换为你的实际区间列表
values = ["10到20", "30到40"]
# 解析区间字符串为数值对
parsed_intervals = []
for interval_str in values:
    v1, v2 = map(float, interval_str.split("到"))
    parsed_intervals.append((v1, v2))

# 生成时间轴与原函数y
t = np.linspace(0, 48, 1000)
y = np.zeros(len(t))
for v1, v2 in parsed_intervals:
    y[(t >= v1) & (t <= v2)] = 1

2. 计算红色曲线

通过识别状态切换点分割区间,逐段计算并传递t0:

# 找到状态变化的索引位置
y_diff = np.diff(y)
change_indices = np.where(y_diff != 0)[0] + 1  # 对应原数组中状态切换的起始索引
# 拼接首尾索引,形成完整的区间分割点
segment_boundaries = np.concatenate([[0], change_indices, [len(t)]])

y_red = np.zeros(len(t))
t0 = 0  # 初始t0,可根据需求调整

for i in range(len(segment_boundaries) - 1):
    start_idx = segment_boundaries[i]
    end_idx = segment_boundaries[i+1]
    t_segment = t[start_idx:end_idx]
    current_state = y[start_idx]
    
    # 根据当前状态计算区间内的红色曲线值
    if current_state == 0:
        y_red[start_idx:end_idx] = t0 + 2 * t_segment + 100
    else:
        y_red[start_idx:end_idx] = t0 + 2 * t_segment - 100
    
    # 更新t0为当前区间的最后一个值
    t0 = y_red[end_idx - 1]

3. 绘图展示

plt.figure(figsize=(10, 6))
plt.plot(t, y, color="blue", label="原函数")
plt.plot(t, y_red, color="red", label="红色曲线")
plt.xlabel("时间t")
plt.ylabel("y值")
plt.legend()
plt.grid(True)
plt.show()

关键说明

  • 状态切换点自动识别:利用np.diff(y)快速定位原函数状态变化的位置,无需手动指定区间
  • 逐段计算的必要性:由于t0是前一段的结果,必须按顺序处理每个区间,保证计算逻辑的正确性
  • 初始t0可自定义:如果需要红色曲线在t=0时有特定初始值,直接修改t0的初始赋值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:00:23