分段函数的

电池初始有电100;有两个耗电任务,速率为-2,task1:开始和结束时间为:“2024-02-02 02:00:00.000”,“2024-02-02 02:10:00.000”;
task2:开始和结束时间为:“2024-02-02 02:20:00.000”,“2024-02-02 02:40:00.000”;
有一个充电任务,速率为1,power:开始和结束时间为:“2024-02-02 02:05:00.000”,“2024-02-02 02:25:00.000”;

import pandas as pd
from datetime import datetime, timedelta
import matplotlib.pyplot as plt

# 定义任务
tasks = [
    {"name": "task1", "rate": -2, "start": "2024-02-02 02:00:00.000", "end": "2024-02-02 02:10:00.000"},
    {"name": "task2", "rate": -2, "start": "2024-02-02 02:20:00.000", "end": "2024-02-02 02:40:00.000"},
    {"name": "power", "rate": 1, "start": "2024-02-02 02:05:00.000", "end": "2024-02-02 02:25:00.000"}
]

# 初始电量
initial_battery = 100

# 将时间字符串转换为datetime对象
for task in tasks:
    task["start"] = datetime.strptime(task["start"], "%Y-%m-%d %H:%M:%S.%f")
    task["end"] = datetime.strptime(task["end"], "%Y-%m-%d %H:%M:%S.%f")


def get_battery_level_at_time(target_time):
    battery_level = initial_battery

    # 遍历每个任务,计算电量变化
    for task in tasks:
        if task["start"] <= target_time <= task["end"]:
            # 计算在目标时间点上的任务持续时间
            delta = (target_time - task["start"]).total_seconds() / 60.0
            battery_level += task["rate"] * delta
        elif task["end"] < target_time:
            # 计算整个任务持续时间
            delta = (task["end"] - task["start"]).total_seconds() / 60.0
            battery_level += task["rate"] * delta

    return battery_level


# 创建一个时间范围,步长为1分钟
start_time = min(task["start"] for task in tasks)
end_time = max(task["end"] for task in tasks) + timedelta(minutes=10)
times = pd.date_range(start_time, end_time, freq='T')

# 计算每个时间点的电量
battery_levels = [get_battery_level_at_time(time) for time in times]

# 可视化电池电量随时间的变化
plt.figure(figsize=(10, 6))
plt.plot(times, battery_levels, label="Battery Level")
plt.axhline(initial_battery, color='r', linestyle='--', label="Initial Battery Level")

# 标记任务的开始和结束时间
for task in tasks:
    plt.axvline(task["start"], color='g', linestyle='--', alpha=0.7)
    plt.axvline(task["end"], color='b', linestyle='--', alpha=0.7)
    plt.text(task["start"], initial_battery + 10, task["name"], rotation=90, verticalalignment='center')

plt.xlabel("Time")
plt.ylabel("Battery Level")
plt.title("Battery Level Over Time")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值