A2C原理和代码实现

A2C算法原理及代码实现 阅读详情

参考王树森《深度强化学习》课程和书籍


1、A2C原理:

在这里插入图片描述


Observe a transition: ( s t , a t , r t , s t + 1 ) (s_t,{a_t},r_t,s_{t+1}) (st​,at​,rt​,st+1​)

TD target:
y t = r t + γ ⋅ v ( s t + 1 ; w ) . y_{t} = r_{t}+\gamma\cdot v(s_{t+1};\mathbf{w}). yt​=rt​+γ⋅v(st+1​;w).
TD error:
δ t = v ( s t ; w ) − y t . \quad\delta_t = v(s_t;\mathbf{w})-y_t. δt​=v(st​;w)−yt​.
Update the policy network (actor) by:
θ ← θ − β ⋅ δ t ⋅ ∂ ln ⁡ π ( a t ∣ s t ; θ ) ∂ θ . \mathbf{\theta}\leftarrow\mathbf{\theta}-\beta\cdot\delta_{t}\cdot\frac{\partial\ln\pi(a_{t}\mid s_{t};\mathbf{\theta})}{\partial \mathbf{\theta}}. θ←θ−β⋅δt​⋅∂θ∂lnπ(at​∣st​;θ)​.


def compute_value_loss(self, bs, blogp_a, br, bd, bns):
    # 目标价值。
    with torch.no_grad():
        target_value = br + self.args.discount * torch.logical_not(bd) * self.V_target(bns).squeeze()
        # torch.logical_not 对输入张量取逻辑非

    # 计算value loss。
    value_loss = F.mse_loss(self.V(bs).squeeze(), target_value)
    return value_loss

Update the value network (critic) by:
w ← w − α ⋅ δ t ⋅ ∂ v ( s t ; w ) ∂ w . \mathbf{w}\leftarrow\mathbf{w}-\alpha\cdot\delta_{t}\cdot{\frac{\partial{v(s_{t}};\mathbf{w})}{\partial\mathbf{w}}}. w←w−α⋅δt​⋅∂w∂v(st​;w)​.


def compute_policy_loss(self, bs, blogp_a, br, bd, bns):
    # 建议对比08_a2c.py,比较二者的差异。
    with torch.no_grad():
        value = self.V(bs).squeeze()

    policy_loss = 0
    for i, logp_a in enumerate(blogp_a):
        policy_loss += -logp_a * value[i]
    policy_loss = policy_loss.mean()
    return policy_loss

2、A2C完整代码实现:

参考后修改注释:最初的代码在https://github.com/wangshusen/DRL

"""8.3节A2C算法实现。"""
import argparse
import os
from collections import defaultdict
import gym
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.distributions import Categorical


class ValueNet(nn.Module):
    def __init__(self, dim_state):
        super().__init__()
        self.fc1 = nn.Linear(dim_state, 64)
        self.fc2 = nn.Linear(64, 32)
        self.fc3 = nn.Linear(32, 1)

    def forward(self, state):
        x = F.relu(self.fc1(state))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


class PolicyNet(nn.Module):
    def __init__(self, dim_state, num_action):
        super().__init__()
        self.fc1 = nn.Linear(dim_state, 64)
        self.fc2 = nn.Linear(64, 32)
        self.fc3 = nn.Linear(32, num_action)

    def forward(self, state):
        x = F.relu(self.fc1(state))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        prob = F.softmax(x, dim=-1)
        return prob


class A2C:
    def __init__(self, args):
        self.args = args
        self.V = ValueNet(args.dim_state)
        self.V_target = ValueNet(args.dim_state)
        self.pi = PolicyNet(args.dim_state, args.num_action)
        self.V_target.load_state_dict(self.V.state_dict())

    def get_action(self, state):
        probs = self.pi(state)
        m = Categorical(probs)
        action = m.sample()
        logp_action = m.log_prob(action)
        return action, logp_action

    def compute_value_loss(self, bs, blogp_a, br, bd, bns):
        # 目标价值。
        with torch.no_grad():
            target_value = br + self.args.discount * torch.logical_not(bd) * self.V_target(bns).squeeze()

        # 计算value loss。
        value_loss = F.mse_loss(self.V(bs).squeeze(), target_value)
        return value_loss

    def compute_policy_loss(self, bs, blogp_a, br, bd, bns):
        # 目标价值。
        with torch.no_grad():
            target_value = br + self.args.discount * torch.logical_not(bd) * self.V_target(bns).squeeze()

        # 计算policy loss。
        with torch.no_grad():
            advantage = target_value - self.V(bs).squeeze()
        policy_loss = 0
        for i, logp_a in enumerate(blogp_a):
            policy_loss += -logp_a * advantage[i]
        policy_loss = policy_loss.mean()
        return policy_loss

    def soft_update(self, tau=0.01):
        def soft_update_(target, source, tau_=0.01):
            for target_param, param in zip(target.parameters(), source.parameters()):
                target_param.data.copy_(target_param.data * (1.0 - tau_) + param.data * tau_)

        soft_update_(self.V_target, self.V, tau)


class Rollout:
    def __init__(self):
        self.state_lst = []
        self.action_lst = []
        self.logp_action_lst = []
        self.reward_lst = []
        self.done_lst = []
        self.next_state_lst = []

    def put(self, state, action, logp_action, reward, done, next_state):
        self.state_lst.append(state)
        self.action_lst.append(action)
        self.logp_action_lst.append(logp_action)
        self.reward_lst.append(reward)
        self.done_lst.append(done)
        self.next_state_lst.append(next_state)

    def tensor(self):
        bs = torch.as_tensor(self.state_lst).float()
        ba = torch.as_tensor(self.action_lst).float()
        blogp_a = self.logp_action_lst
        br = torch.as_tensor(self.reward_lst).float()
        bd = torch.as_tensor(self.done_lst)
        bns = torch.as_tensor(self.next_state_lst).float()
        return bs, ba, blogp_a, br, bd, bns


class INFO:
    def __init__(self):
        self.log = defaultdict(list)
        self.episode_length = 0
        self.episode_reward = 0
        self.max_episode_reward = -float("inf")

    def put(self, done, reward):
        if done is True:
            self.episode_length += 1
            self.episode_reward += reward
            self.log["episode_length"].append(self.episode_length)
            self.log["episode_reward"].append(self.episode_reward)

            if self.episode_reward > self.max_episode_reward:
                self.max_episode_reward = self.episode_reward

            self.episode_length = 0
            self.episode_reward = 0

        else:
            self.episode_length += 1
            self.episode_reward += reward


def train(args, env, agent: A2C):
    V_optimizer = torch.optim.Adam(agent.V.parameters(), lr=3e-3)
    pi_optimizer = torch.optim.Adam(agent.pi.parameters(), lr=3e-3)
    info = INFO()

    rollout = Rollout()
    state, _ = env.reset()
    for step in range(args.max_steps):
        action, logp_action = agent.get_action(torch.tensor(state).float())
        next_state, reward, terminated, truncated, _ = env.step(action.item())
        done = terminated or truncated
        info.put(done, reward)

        rollout.put(
            state,
            action,
            logp_action,
            reward,
            done,
            next_state,
        )
        state = next_state

        if done is True:
            # 模型训练。
            bs, ba, blogp_a, br, bd, bns = rollout.tensor()

            value_loss = agent.compute_value_loss(bs, blogp_a, br, bd, bns)
            V_optimizer.zero_grad()
            value_loss.backward(retain_graph=True)
            V_optimizer.step()

            policy_loss = agent.compute_policy_loss(bs, blogp_a, br, bd, bns)
            pi_optimizer.zero_grad()
            policy_loss.backward()
            pi_optimizer.step()

            agent.soft_update()

            # 打印信息。
            info.log["value_loss"].append(value_loss.item())
            info.log["policy_loss"].append(policy_loss.item())

            episode_reward = info.log["episode_reward"][-1]
            episode_length = info.log["episode_length"][-1]
            value_loss = info.log["value_loss"][-1]
            print(f"step={step}, reward={episode_reward:.0f}, length={episode_length}, max_reward={info.max_episode_reward}, value_loss={value_loss:.1e}")

            # 重置环境。
            state, _ = env.reset()
            rollout = Rollout()

            # 保存模型。
            if episode_reward == info.max_episode_reward:
                save_path = os.path.join(args.output_dir, "model.bin")
                torch.save(agent.pi.state_dict(), save_path)

        if step % 10000 == 0:
            plt.plot(info.log["value_loss"], label="value loss")
            plt.legend()
            plt.savefig(f"{args.output_dir}/value_loss.png", bbox_inches="tight")
            plt.close()

            plt.plot(info.log["episode_reward"])
            plt.savefig(f"{args.output_dir}/episode_reward.png", bbox_inches="tight")
            plt.close()


def eval(args, env, agent):
    agent = A2C(args)
    model_path = os.path.join(args.output_dir, "model.bin")
    agent.pi.load_state_dict(torch.load(model_path))

    episode_length = 0
    episode_reward = 0
    state, _ = env.reset()
    for i in range(5000):
        episode_length += 1
        action, _ = agent.get_action(torch.from_numpy(state))
        next_state, reward, terminated, truncated, info = env.step(action.item())
        done = terminated or truncated
        episode_reward += reward

        state = next_state
        if done is True:
            print(f"episode reward={episode_reward}, length={episode_length}")
            state, _ = env.reset()
            episode_length = 0
            episode_reward = 0


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--env", default="CartPole-v1", type=str, help="Environment name.")
    parser.add_argument("--dim_state", default=4, type=int, help="Dimension of state.")
    parser.add_argument("--num_action", default=2, type=int, help="Number of action.")
    parser.add_argument("--output_dir", default="output", type=str, help="Output directory.")
    parser.add_argument("--seed", default=42, type=int, help="Random seed.")

    parser.add_argument("--max_steps", default=100_000, type=int, help="Maximum steps for interaction.")
    parser.add_argument("--discount", default=0.99, type=float, help="Discount coefficient.")
    parser.add_argument("--lr", default=1e-3, type=float, help="Learning rate.")
    parser.add_argument("--batch_size", default=32, type=int, help="Batch size.")
    parser.add_argument("--no_cuda", action="store_true", help="Avoid using CUDA when available")

    parser.add_argument("--do_train", action="store_true", help="Train policy.")
    parser.add_argument("--do_eval", action="store_true", help="Evaluate policy.")
    args = parser.parse_args()

    env = gym.make(args.env)
    agent = A2C(args)

    if args.do_train:
        train(args, env, agent)

    if args.do_eval:
        eval(args, env, agent)


3、torch.distributions.Categorical()

probs = policy_network(state)
# Note that this is equivalent to what used to be called multinomial
m = Categorical(probs) # 用probs构造一个分布
action = m.sample() # 按照probs进行采样
next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward # log_prob 计算log(probs[action])的值
loss.backward()

Probability distributions - torch.distributions — PyTorch 2.0 documentation

next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward # log_prob 计算log(probs[action])的值
loss.backward()


[Probability distributions - torch.distributions — PyTorch 2.0 documentation](https://pytorch.org/docs/stable/distributions.html)

[【PyTorch】关于 log_prob(action) - 简书 (jianshu.com)](https://www.jianshu.com/p/06a5c47ee7c2)
强化学习之AC、A2C和A3C 阅读本文可参考我以前的文章《强化学习实践教学》https://tianjuewudi.gitee.io/2021/07/16/qiang-hua-xue-xi-shi-jian-jiao-xue/#toc-heading-29,其中的连续动作空间上求解RL章节是本文的基础,其中的DDPG和Actor-Critic除了Target网络外其余都一致。 首先,A2C的全称是Advantage Actor Critic,而A3C是Asynchronous Advantage Actor Critic,A2C源自A3 阅读详情

相关推荐

Actor-Critic(A2C)算法 原理讲解+pytorch程序实现

Actor-Critic(A2C)算法时强化学习中一种基于策略梯度(Policy Gradient)和价值函数(Value Function)的强化学习方法,通常被用于解决连续动作空间和高维状态空间下的强化学习问题。本文将详细推导Actor-Critic的实现过程并且附上基于pytorch实现的代码,最后给出算法优缺点分析和使用心得。

qq_44949041的博客 2万+

A2C(Advantage Actor-Critic)算法

A2C算法是一种基于Actor-Critic框架的强化学习算法,它结合了策略梯度方法(Actor)和价值函数估计方法(Critic)的优点,通过同时优化策略和价值函数来提高学习效率和性能。A2C算法通过并行化多个环境来加速训练过程,并使用多个策略梯度更新来稳定训练过程。此外,A2C算法还引入了熵正则化项来鼓励策略的探索性,从而提高算法的泛化能力。

weixin_55749690的博客 5410

强化学习算法A2C(Advantage Actor-Critic)和A3C(Asynchronous Advantage Actor-Critic)算法详解以及A2C的Pytorch实现

一、策略梯度算法回顾 策略梯度(Policy Gradient)算法目标函数的梯度更新公式为: ▽Rˉθ=1N∑n=1N∑t=1Tn(∑t′=tTnγt′−trt′n−b)▽logpθ(atn∣stn)(1)\bigtriangledown \bar{R}_{\theta } = \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_{n}}(\sum_{{t}'=t}^{T_{n}}\gamma ^{{t}'-t}r_{{t}'}^{n}-b)\bigtriangledown lo

qq_41626059的博客 1万+

【强化学习】A2C算法原理及其Python实现

本文系统介绍了A2C(Advantage Actor-Critic)强化学习算法,重点阐述了其Actor-Critic架构和优势函数的核心原理。文章详细讲解了A2C算法的训练流程,包括参数初始化、采样、优势函数计算、损失函数设计和网络更新等关键步骤。通过CartPole-v1环境的Python实战演示,展示了算法实现过程及结果分析方法。此外,文章探讨了A2C在游戏AI、机器人控制和金融投资等领域的应用案例,并展望了算法优化、技术融合和应用拓展等未来发展方向。

大雨淅淅的博客 1336

强化学习笔记+代码(七):Actor-Critic、A2C、A3C算法原理和Agent实现(tensorflow)

本文主要整理和参考了李宏毅的强化学习系列课程和莫烦python的强化学习教程 本系列主要分几个部分进行介绍 强化学习背景介绍 SARSA算法原理和Agent实现 Q-learning算法原理和Agent实现 DQN算法原理和Agent实现(tensorflow) Double-DQN、Dueling DQN算法原理和Agent实现(tensorflow) Policy Gradients算法原理...

u011517132的博客 7877

简易北斗C/A码matlab仿真

简易北斗C/A码matlab仿真 1.C/A码产生原理 BD2B1 CA码产生原理框图如图所示,图中的方框可以通过移位寄存器来实现,模2加用异或来实现。从图下可见,码由两个线性序列G1 和G2 模二和产生平衡Gold 码后截短1 码片生成。G1 和G2 序列分别由两个11 级线性移位寄存器生成,其生成多项式为: G1(X)=1+X+X7+X8+X9+X10+X11(系数为代码中的S1) G2(X)=1+X+X2+X3+X4+X5 +X8+X9+X11(系数为代码中的S2) G1 和G2 的初始相位为:010

weixin_42056401的博客 6748

强化学习初探:A2C方法(踩坑)

这个方法可以尝试一下,但是它存在一些问题,你需要注意到,他的计算参数实际上对state和action都有影响,简单来说,这个值不仅仅是简单通过计算Q的算术平均数来计算的,它其实还考虑了state和action的出现概率(这是一个很明显的问题,但是大多数的人包括我,在考虑均值的时候仍然会考虑算数平均,但其实期望是一个加权平均,但是这里我并未否定使用算数平均方法的可行性,因为我没试验过,也可能是有效的,因为不管是Q-value还是V-value,在近似的时候都不是准确的)。接下啦就是用代码实现的问题了。

weixin_45347035的博客 1140

如何使用stc12c5a60s2控制蜂鸣器

如何使用stc12c5a60s2控制蜂鸣器 1,蜂鸣器的简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 “Smartcar智能小车爱好者”的小车上的蜂鸣器是电磁式的有源蜂鸣器,如下图所示: 这里的有源不是指电源的“源”...

weixin_42537128的博客 3644

RL论文阅读1- 从PG到AC、A3C和A2C的理论推导+tensorflow2.0代码实现

文章目录A3C.2016 and A2CTittle标签总结针对的问题解决方法优点原理PG(Policy Gradient):AC:A2C和A3C的原理支撑:Actor:Actor在Continues Action 连续动作空间处理CriticA3C的架构:A2C架构代码实现:reference A3C.2016 and A2C Tittle source 标签 Model-free Poli...

铁锹的填坑记录 3450

基于STC12C5A60S2系列1T 8051单片机实现74HC595控制LED或数码管显示按键值的功能

基于STC12C5A60S2系列1T 8051单片机实现74HC595控制LED或数码管显示按键值的功能STC12C5A60S2系列1T 8051单片机管脚图74HC595介绍74HC595管脚图74HC595真值表74HC595工作原理74HC595控制八个LED灯电路连接74HC595控制十六个LED灯电路连接74HC595控制八个数码管电路连接基于STC12C5A60S2系列1T 8051单片机实现74HC595控制LED或数码管显示按键值的功能编程基于STC12C5A60S2系列1T 8051单片机

CWQLTYH的博客 863

A2C:同步优势ActorCritic算法

1. 背景介绍 1.1 强化学习的兴起 强化学习(Reinforcement Learning, RL)作为机器学习的一个重要分支,近年来取得了令人瞩目的成就。其核心思想是通过智能体与环境的交互学习,不断优化自身的策略以获得最大化的累积奖励。强化学习在游戏、机器人控制、自动驾驶等领域展现出巨大的应用潜

AI天才研究院 862

深度探索rl_games架构:A2C与SAC算法的实现原理与代码剖析

rl_games是一个功能强大的强化学习框架,提供了A2C(Advantage Actor-Critic)和SAC(Soft Actor-Critic)等主流强化学习算法的实现,帮助开发者快速构建和训练强化学习智能体。本文将深入剖析rl_games架构中A2C与SAC算法的实现原理,并结合代码进行详细解读。 ## A2C算法在rl_games中的实现 A2C算法是一种经典的 Actor-Cri

gitblog_00679的博客 743

一切皆是映射:DQN中的异步方法:A3C与A2C详解

一切皆是映射:DQN中的异步方法:A3C与A2C详解 关键词: 异步强化学习 A3C(Asynchronous Advantage Actor-Critic) A2C(Advantage Actor-Critic)

AI大模型应用之禅 316

Reinforcement Learning with Code【Code 6. Advantage Actor-Critic(A2C)】

记录笔者学习强化学习的过程,附带代码实现

Shen Mu Xin's Blog 428

C#菜鸟教程学习笔记

C#菜鸟教程学习笔记 C#简介 C# 是一种编程语言,它是由微软开发的。 C# 编程是基于 C 和 C++ 编程语言的,它与 Java 也非常相似。 C# 是 .Net 框架的一部分,且用于编写 .Net 应用程序。 .Net 框架(.Net Framework)能编写出下面类型的应用程序: ①Windows 应用程序 ②Web 应用程序 ③Web 服务 常用的C# 编程的开发工具:Visual Studio(VS:可视化工作室) C#程序结构 一个 C# 程序(C# 文件的后缀为 .cs)主要包括以下部分

mlc_WTMOTW的博客 4974

EDA的未来:当AI与Cadence Virtuoso相遇

本文探讨了AI技术与Cadence Virtuoso在EDA领域的融合,展示了如何通过生成式AI提升芯片设计效率。文章详细分析了Virtuoso设计环境的智能化演进、AI驱动的设计辅助功能实现路径,以及SKILL语言的进化方向,为工程师提供了未来EDA工具的发展趋势和实用案例。

weixin_28312391的博客 644

强化学习的AdvantageActorCritic(A2C)

1.背景介绍 1. 背景介绍 强化学习(Reinforcement Learning,RL)是一种人工智能技术,旨在让智能体在环境中学习如何做出最佳决策,以最大化累积奖励。AdvantageActor-Critic(A2C)是一种常见的强化学习算法,它结合了基于价值的方法(Critic)和基于策略的方法(Actor),以提高学习效率和准确性。 在本文中,我们将深入探讨A2C算法的核心概念、算...

AI天才研究院 949

嵌入式开发避坑指南:用DWT做延时函数,这几个细节不注意代码会跑飞

本文深入探讨了在Cortex-M嵌入式开发中使用DWT实现精确延时函数的关键技巧与常见陷阱。针对DWT_CYCCNT计数器应用中的内核兼容性、溢出处理、编译器优化等五大核心问题,提供了工业级稳健解决方案,帮助开发者避免代码跑飞风险,实现微秒级高精度延时控制。

weixin_42653691的博客 158

GPS信号生成:C/A码序列生成【MATLAB实现】

实现GPS信号的C/A码序列的生成。

JavaYoung123的博客 3100

VCSA 上的 vmware-vpxd 服务失败,Web端提示503 服务不可用 (503 Service Unavailable)

昨晚VCSA碰到一个很诡异的问题: 使用 vSphere Web Client 连接到 vCenter Server Appliance时失败,提示: 503 服务不可用 (503 Service Unavailable) 无法连接端点 (Failed to connect to endpoint):[N7Vmacore4Http20NamedPipeServiceSpecE:0x00007f975808ee30] _serverNamespace = / action = Allow _pipeNam

徐华的博客 2万+

移动端实战指南:深入理解 & 接入 IAB OMSDK

OMSDK(OpenMeasurementSDK)是IABTechLab推出的标准化测量工具,用于统一移动端/原生App广告的可见性和验证流程。其核心包括Native库(采集设备数据)和OMID JavaScript层(实现通信),通过标准化接口让开发者只需接入一套SDK即可兼容多个测量厂商,减少冲突和性能损耗。v1.4版本强化了对CTV和原生App场景的支持,而v1.5新增了画中画检测等功能。集成流程需通过IAB技术实验室注册下载,并遵循严格的命名空间规则。测试阶段需嵌入验证脚本并通过指定工具验证

帅次的博客 1184

深度强化学习从入门到大师:简单介绍A3C (第五部分)

本文为 AI 研习社编译的技术博客,原标题 : An intro to Advantage Actor Critic methods: let’s play Sonic the Hedgehog! 作者 |Thomas Simonini 翻译、校对 | 斯蒂芬•二狗子 审核| 邓普斯•杰弗 整理 | 菠萝妹 原文...

weixin_33695082的博客 329

ESP32设备驱动-TB6612FNG直流电机驱动

TB6612FNG 是一款出色的双电机驱动器,非常适合将两个小型直流电机(例如微型金属齿轮电机)连接到微控制器,它还可以用于控制单个双极步进电机。 基于 MOSFET 的 H 桥比 L298N 和 Sanyo 的 LB1836M 等旧式驱动器中使用的基于 BJT 的 H 桥效率高得多,后者允许将更多电流输送到电机,而从逻辑电源汲取的电流更少 (对于真正低电压的应用,LB1836 仍然具有 TB6612 的优势)。

视觉与物联智能 3401

STC12C5A60S2 红外遥控 LCD显示

STC12C5A60S2(引脚排序及基本功能同AT89S51)作为主控芯片,利用遥控器按键设计实现英文和数字的输入功能并在LCD上显示,并利用红外遥控器实现对LED灯的亮灭控制功能。 1.利用遥控器设计实现英文和数字的输入功能并在LCD上显示。 2.控制LED灯的亮灭。 原理图设计 1.原理图设计要符合项目的工作原理,连线要正确。 2.图中所使用的元器件要合理选用,电阻、电容等器件的参数要正确标明。 3.原理图要完整,CPU、外围器件、外扩接口、输入/输出装置要一应俱全。 红外遥控代码

qq_46149092的博客 1193

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分析。Impedance是时域阻抗曲线,也是最主要的观测指标,注意:impedance曲线的时间刻度不是延时,延时=时间刻度/2,因为TDR测量的是用一来一回的原理去测量的。Use Lossy peeling 默认不勾选,勾选的话代表同时仿真无损和有损方案,不勾选代表仅仿真有损方案。

weixin_54787054的博客 855

量子化学仿真软件:VASP_(9).磁性材料计算

在量子化学仿真软件 VASP 中,磁性材料的计算是一个复杂但重要的过程。通过正确设置磁性状态、分析磁性性质、优化计算参数以及研究磁性相变和磁动力学,可以更准确地描述和预测磁性材料的性能。希望本节的内容能够为研究磁性材料的科研人员提供有用的参考和指导。

kkchenjj的博客 1374
上一篇: dueling network原理和实现
下一篇: KL散度原理和实现
KPer_Yang
博客等级 码龄4年 281粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值