`

Lua5.1代码阅读(七):lvm.h/lvm.c

 
阅读更多

 

Lua5.1代码阅读(七):lvm.h/lvm.c

 

(未完成,待修改)

一、概览

lvm.h/lvm.c的作用是提供底层的Lua虚拟机。

这个模块主要是用于循环读取并分解指令,

然后根据其操作码的枚举值进行处理或跳转到Lua的其它模块。

内部的函数引用图如下:


 

参考资料:

* A No-Frills Introduction to Lua 5.1 VM Instructions

http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf

* 翻译Lua 5.1 VM Instructions(一)

http://blog.csdn.net/tm_wb/article/details/3453159

* 详解关于Lua源码分析学习教程

http://www.61ic.com/Mobile/iPhone/201108/36968.html

 

(Lua虚拟机的体系结构图,链接已废除,见

http://mobile.51cto.com/iphone-286631.htm 

 

* Lua VM 指令:导言

http://blog.csdn.net/chenyufei1013/article/details/4445803

* lua5.1.3编译器和虚拟机  

http://blog.163.com/very_fyy/blog/static/2252168520083731434459/

* Lua 5.1.4 Annotated Source

http://stevedonovan.github.com/lua-5.1.4/

* Lua VM hack for execution time limits.

http://www.gammon.com.au/forum/?id=8453

* 详解如何实现Lua调试器案例

http://cnztech.com/html/mobile/iOS/2011/0924/46517.html

* Lua源代码分析顺序

http://wenku.baidu.com/view/24241ec4aa00b52acfc7caea.html

* 解析关于Lua调试器案例实现

http://mobile.51cto.com/iphone-288412.htm

* strange warnings

http://comments.gmane.org/gmane.comp.lang.lua.general/79521

* Lua GC 的源码剖析 (4)

http://blog.codingnow.com/2011/03/lua_gc_4.html

* 详解关于Lua源码分析学习教程

http://mobile.51cto.com/iphone-286631.htm

* Lua4虚拟机运行概述

http://blog.csdn.net/wondeful18/article/details/2982251

* Lua4

http://cjbskysea.blogbus.com/logs/84351473.html

二、头文件

#include "ldo.h"

#include "lobject.h"

#include "ltm.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "lua.h"

#include "ldebug.h"

#include "ldo.h"

#include "lfunc.h"

#include "lgc.h"

#include "lopcodes.h"

#include "lstate.h"

#include "lstring.h"

#include "ltable.h"

#include "lvm.h"

 

三、公共或私有的宏定义

1. #define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o)))

转换o为LUA_TSTRING类型。

* 判断o(TValue*类型)是否为LUA_TSTRING类型。

* 如果不是,就用luaV_tostring把o(必须是LUA_TNUMBER类型)转换为字符串。

* 如果转换后o仍然不是LUA_TSTRING类型,那么返回0,否则返回1。

2. #define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \

        (((o) = luaV_tonumber(o,n)) != NULL))

        转换o为LUA_TNUMBER类型。

        * 判断o(TValue*类型)是否为LUA_TNUMBER类型。

        * 如果不是,就用luaV_tonumber把o(必须是LUA_TSTRING而且可以转换为数字)转换为数。

* 如果转换后o仍然不是LUA_TNUMBER类型,那么返回0,否则返回1。

 

3. #define equalobj(L,o1,o2) \

(ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2))

判断o1和o2的类型和值是否都相等。

4. #define lvm_c

象征意味,表示当前在lvm.c中

5. #define LUA_CORE

象征意味,表示当前代码为Lua底层实现

6. #define MAXTAGLOOP 100

表的标签方法链的最大限制(避免死循环)。

这个宏定义在luaV_gettable和luaV_settable。

因为这两个函数在查询和修改表元素时,

如果__index和__newindex元方法的值本身也是一个table,

则可能出现迭代调用。

如果出现死循环,将调用luaG_runerror抛出异常。

7. #define runtime_check(L, c) { if (!(c)) break; }

在luaV_execute使用,

用于判断OP_SETLIST指令的RA值是否为table类型,如果不是就跳出switch。

(OP_SETLIST表示不带"="的表构造式,例如a={1})

8. #define RA(i) (base+GETARG_A(i))

获得TValue*型的RA值(寄存器表基地址加上参数A偏移)

* 取出指令i中的参数A(栈偏移值),

* 把参数A作为偏移加上L->base(当前函数TValue数组的基)地址后算出指针。

9. #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))

获得TValue*型的RB值(寄存器表基地址加上参数B偏移)

* 取出指令i中的操作码

* 用lua_assert诊断操作码的B模式是OpArgR(通过查表判断,见getBMode和luaP_opmodes)。OpArgR表示参数是一个寄存器或跳转偏移。

* 取出指令i中的参数B(栈偏移值),

* 把参数B作为偏移加上L->base(当前函数TValue数组的基)地址后算出指针。

10. #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))

获得TValue*型的RC值(寄存器表加上参数C偏移,实际上没有任何代码使用此宏)

* 取出指令i中的操作码

* 用lua_assert诊断操作码的C模式是OpArgR(通过查表判断,见getCMode和luaP_opmodes)。OpArgR表示参数是一个寄存器或跳转偏移。

* 取出指令i中的参数C(栈偏移值),

* 把参数C作为偏移加上L->base(当前函数TValue数组的基)地址后算出指针。

11. #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \

ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))

获得TValue*型的RKB值(寄存器表或常量表基地址加上参数B偏移)

* 取出指令i中的操作码

* 用lua_assert诊断操作码的B模式是OpArgK(通过查表判断,见getBMode和luaP_opmodes)。OpArgK表示参数是一个常量或寄存器/常量。

* 取出指令i中的参数B(栈偏移值)

* 判断参数B(栈偏移值)是否为K型(常量),即它的最高位(参数B占二进制的9位)是否为1,

* 如果参数B是K型,那么参数B去掉最高位的1,然后作为偏移加上k(当前函数原型Proto结构体的k域指针)

* 否则,把参数B作为偏移加上L->base(当前函数TValue数组的基)地址后算出指针。

12. #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \

ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))

获得TValue*型的RKC值(寄存器表或常量表基地址加上参数C偏移)

* 取出指令i中的操作码

* 用lua_assert诊断操作码的C模式是OpArgK(通过查表判断,见getCMode和luaP_opmodes)。OpArgK表示参数是一个常量或寄存器/常量。

* 取出指令i中的参数C(栈偏移值)

* 判断参数C(栈偏移值)是否为K型(常量),即它的最高位(参数C占二进制的9位)是否为1,

* 如果参数C是K型,那么参数C去掉最高位的1,然后作为偏移加上k(当前函数原型Proto结构体的k域指针)

* 否则,把参数C作为偏移加上L->base(当前函数TValue数组的基)地址后算出指针。

13. #define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i))

获得TValue*型的KBx值(常量表基地址加上参数Bx偏移)

* 取出指令i中的操作码

* 用lua_assert诊断操作码的B模式是OpArgK(通过查表判断,见getBMode和luaP_opmodes)。OpArgK表示参数是一个常量或寄存器/常量。

* 取出指令i中的参数Bx(栈偏移值)

* 把参数Bx作为偏移加上k(当前函数原型Proto结构体的k域指针)

14. #define dojump(L,pc,i) {(pc) += (i); luai_threadyield(L);}

增加程序计数器。

把pc值(即L->savedpc)递增i,然后用luai_threadyield挂起L栈以切换到其它系统级线程。

(默认luai_threadyield是无操作的)。

15. #define Protect(x) { L->savedpc = pc; {x;}; base = L->base; }

保护代码,同步L栈和luaV_execute函数栈两者之间的pc和base(?)

(貌似是因为luaV_execute函数太长,需要把部分代码分离到其它函数)

* 把临时的pc保存到L->savedpc

* 执行一段代码。

* 把最新的L->base同步到函数luaV_execute的局部变量base。

16. #define arith_op(op,tm) { \

TValue *rb = RKB(i); \

TValue *rc = RKC(i); \

if (ttisnumber(rb) && ttisnumber(rc)) { \

 lua_Number nb = nvalue(rb), nc = nvalue(rc); \

 setnvalue(ra, op(nb, nc)); \

} \

else \

 Protect(Arith(L, ra, rb, rc, tm)); \

 }

直接或用元方法执行算术运算(Arithmetic)

包括加、减、乘、除、取模和乘幂。

* 如果RKB和RKC都是LUA_TNUMBER型,那么用op宏或函数计算RKB和RKC,结果保存到RA

* 否则用提供的tm(元方法枚举量)调用Arith(查元表)进行算术运算。

 

四、私有的静态函数

1. static void traceexec (lua_State *L, const Instruction *pc) {

每次指令解析前调用钩子函数。

2. static void callTMres (lua_State *L, StkId res, const TValue *f,

const TValue *p1, const TValue *p2) {

调用元方法,用于__index、算术运算、大小比较的元方法值,

3. static void callTM (lua_State *L, const TValue *f, const TValue *p1,

        const TValue *p2, const TValue *p3) {

        调用元方法,用于function型的__newindex元方法值。

 

    4. static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,

StkId res, TMS event) {

调用一元或二元的元方法,用于算术运算、取长度或拼接。

    5. static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,

        TMS event) {

从Table*对象的mt1和mt2中取出要使用的元方法的值。

用于判定要使用的元方法__eq的值。

    6. static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,

        TMS event) {

        对p1和p2执行用于比较操作的元方法。

    7. static int l_strcmp (const TString *ls, const TString *rs) { 

字符串TString*对象的大小比较。

8. static int lessequal (lua_State *L, const TValue *l, const TValue *r) {

判断同类型TValue对象l和r的值是否满足小于。

必要时调用元方法__lt和__le。

9. static void Arith (lua_State *L, StkId ra, const TValue *rb,

        const TValue *rc, TMS op) {

算术运算ra := rb op rc或ra := op rb

* 尝试转换为Number型

* 如果两个操作数都转换成功,则执行默认操作luai_numadd,luai_numsub,luai_nummul,luai_numdiv,luai_nummod,luai_numpow和luai_numunm。

* 如果不成功,执行元方法__add,__sub,__mul,__div,__mod,__pow和__unm。

五、公开的导出函数

1. LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);

const TValue *luaV_tonumber (const TValue *obj, TValue *n) {

把obj转换为Number型。

2. LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);

int luaV_tostring (lua_State *L, StkId obj) {

把obj转换为string型。

3. LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val);

void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {

表的get操作(查询)。

必要时调用元方法__index。

4. LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val);

void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {

表的set操作(更新)。

必要时调用元方法__newindex。

5. LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);

int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {

判断两个同类型TValue对象l和r的值是否满足小于。

必要时调用元方法__lt。

6. LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2);

int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) {

判断两个同类型TValue对象t1和t2的值是否相等。

必要时调用元方法__eq。

7. LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);

void luaV_concat (lua_State *L, int total, int last) {

默认的拼接操作,

必要时调用元方法__concat。

8. LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);

void luaV_execute (lua_State *L, int nexeccalls) {

提取当前指令的操作码和参数,然后执行与操作码对应的switch跳转。

它是解释器(虚拟机)的主循环。

六、值得关注的函数

1. luaV_execute

虚拟机的核心。

 

七、补充:

Lua虚拟机的体系结构图

摘自

http://mobile.51cto.com/iphone-286631.htm


 

 

 

(未完成,待修改)


  • 大小: 66.1 KB
  • 大小: 7.3 KB
分享到:
评论

相关推荐

    基于ssm的网络教学平台(有报告)。Javaee项目,ssm项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144929660 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    2024年AI代码平台及产品发展简报-V11.pdf

    2024年AI代码平台及产品发展简报-V11

    蓝桥杯JAVA代码.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调;

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调; FPGA设计; 详细实验文档,基于QPSK调制的FPGA设计与实验文档

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研究,PID, ADRC和MPC轨迹跟踪控制器Simulink仿真模型。 MPC用于跟踪轨迹 ADRC用于跟踪理想横摆角 PID用于跟踪轨迹 轨迹工况有双移线,避障轨迹,正弦轨迹多种 matlab版本为2018,carsim版本为8 ,PID; ADRC; MPC; 轨迹跟踪控制器; Simulink仿真模型; 双移线; 避障轨迹; 正弦轨迹; MATLAB 2018; CarSim 8,基于Simulink的PID、ADRC与MPC轨迹跟踪控制器仿真模型研究

    基于Springboot的个性化图书推荐系统。Javaee项目,springboot项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144486173 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    Matlab实现Transformer-Adaboost时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂 该案例是文献复现,文献与案例一起 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂。 该案例是文献复现,文献与案例一起。 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破裂:障碍挑战的文献复现案例

    蓝桥杯练习题_2.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    蓝桥杯笔记,用于个人学习进步.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升 ,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升。,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提升模型精度和鲁棒性,基于变预测时域的MPC自适应轨迹跟踪控制,针对轮胎刚度时变的特点造成控制模型精度降低,基于最小递归二乘法(RLS)估算的轮胎侧偏刚度,提升了模型的控制精度和鲁棒性,通过carsim与simulink联合仿真结果发现,改进后的轨迹跟踪控制器既满足了车辆低速行驶下的轨 迹跟踪精度,也一定程度上克服了高速下车辆容易失去稳定性的问题。 有详细的lunwen分析说明和资料,以及本人的,仿真包运行。 ,基于变预测时域的MPC; 自适应轨迹跟踪控制; 轮胎刚度时变; 控制模型精度降低; 最小递归二乘法(RLS)估算; 模型控制精度和鲁棒性提升; carsim与simulink联合仿真; 轨迹跟踪控制器; 车辆稳定性。,基于变预测时域MPC的轮胎刚度自适应轨迹跟踪控制策略研究

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计; 详细实验文档; 实验结果分析,GMSK调制解调技术:FPGA设计与实验详解

    (源码)基于Arduino和Python的Cansat卫星系统.zip

    # 基于Arduino和Python的Cansat卫星系统 ## 项目简介 本项目是一个Cansat卫星系统,旨在设计和实现一个小型卫星模型,通过火箭发射至1公里高空,并使用地面站接收其传输的数据。项目涉及Arduino编程、Python数据处理和可视化。 ## 主要特性和功能 1. 硬件组件 使用Arduino Nano作为Cansat的微控制器。 搭载BMP 280温度和压力传感器、ATGM336H GPS模块、LoRa通信模块等。 地面站使用Arduino Uno和LoRa通信模块接收数据。 2. 数据处理 使用Python进行数据处理和可视化,包括数据清洗、计算风速、绘制温度、压力、风速和海拔随时间变化的图表等。 3. 通信与控制 通过LoRa模块实现Cansat与地面站之间的数据传输。 提供实时监视和记录数据的脚本。 ## 安装和使用步骤 ### 1. 硬件准备

    LongSung-USB-Drivers-V2.0-for-Windows

    U9300C 龙尚4G模块安装后模块才能正常使用,win7 win10驱动程序,支持USB转接板。

    (源码)基于Arduino平台的物联网温湿度监控系统.zip

    # 基于Arduino平台的物联网温湿度监控系统 ## 项目简介 这是一个基于Arduino平台的物联网温湿度监控项目,旨在通过简单的硬件设备实现环境数据的实时监测与远程管理。该项目适用于智能家居、农业种植等领域。 ## 项目的主要特性和功能 1. 温湿度数据采集通过Arduino板连接温湿度传感器,实时采集环境数据。 2. 数据传输将采集到的数据通过无线网络模块发送到服务器或远程终端。 3. 数据可视化可在电脑或移动设备端展示实时的温湿度数据。 4. 报警功能当温湿度数据超过预设阈值时,自动触发报警通知。 ## 安装使用步骤 前提假设用户已经下载了本项目的源码文件。以下是简单明了的安装使用步骤 1. 环境准备安装Arduino开发环境,配置必要的硬件接口。 2. 硬件连接将Arduino板与温湿度传感器、无线网络模块连接。 3. 代码上传将本项目提供的Arduino代码上传至Arduino板。

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求响应的配电网重构(matlab代码) 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的非凸性,引入中间变量并对其进行二阶锥松弛,构建混合整数凸规划模型,采用改进的 IEEE33 节点配电网进行算例仿真,分析了需求响应措施和清洁能源渗透率对配电网重构结果的影响。 该程序复现效果和出图较好(详见程序结果部分),注释清楚,方便学习 ,高比例清洁能源; 需求响应; 配电网重构; 二阶锥松弛; 综合成本最小化; MATLAB代码; IEEE33节点配电网; 复现效果; 出图; 注释清楚。,Matlab代码复现:高比例清洁能源接入下的配电网重构模型与需求响应分析

    (源码)基于C++的RapidJSON库测试项目.zip

    # 基于C++的RapidJSON库测试项目 ## 项目简介 本项目是一个基于C++的RapidJSON库测试项目,主要用于测试RapidJSON库的功能正确性、性能以及稳定性。RapidJSON是一个高效的C++ JSON解析生成库,广泛应用于各种场景。本项目通过编写一系列的单元测试,覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以确保RapidJSON库在各种情况下都能正确、稳定地工作。 ## 项目的主要特性和功能 1. 单元测试框架使用Google Test测试框架进行单元测试,确保测试的可靠性和可扩展性。 2. 全面测试覆盖覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以及针对各种输入数据的测试。 3. 性能测试通过性能基准测试,评估RapidJSON库在处理不同规模和类型的JSON数据时的性能表现。

    蓝桥杯单片机十一届试题.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    vmware虚拟机安装教程.docx

    内容概要:本文详细介绍如何安装和初步使用 VMware 虚拟机,从下载安装 VMware 到创建和配置新的虚拟机。主要内容包括:软件选择和安装步骤、虚拟机的新建配置、操作系统安装及初始化设置、安装 VMware Tools 提升性能以及一些常用的 VMWare 功能,如虚拟网络的不同连接方式及其应用场景。同时介绍了 VMware 软件在网络连接管理和服务配置方面的一些要点,确保虚拟机正常运行。 适用人群:计算机操作较为熟练、有意搭建不同操作系统测试环境的技术人员,以及想要了解虚拟机基本概念及应用的学生。 使用场景及目标:适合于个人用户进行系统兼容性和安全性的验证;适用于企业或开发者做软件测试、模拟复杂环境下作业,确保不影响宿主机正常工作的前提下完成多种任务;适用于教学培训环境中部署实验平台。此外,还可以用来隔离特定业务流程(比如银行工具)、探索不同类型操作系统的特点。 其他说明:需要注意的是,为了避免安装过程中出现问题,建议暂时关闭杀毒软件和防火墙。安装 VMware 需要接受许可协议,同时可以选择安装路径和安装类型(典型/自定义)。最后,对于网络设置,默认提供的三种模式——桥接模式、仅主机模式和 NAT 模式,可以帮助用户根据不同需求灵活调整网络连接方式。

    java毕业设计之网上校友录设计源码.zip

    java毕业设计源码

Global site tag (gtag.js) - Google Analytics