如何绘制依赖于二值时间函数的分段动态函数?
实现思路与代码示例
你的需求核心是基于原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
相关产品推荐
相关产品推荐

