如何实现恒功率负载 (CPL)
How to implement a constant power load (CPL)
如何实现恒功率负载?
考虑以下电路。这包含一个恒定的功率负载,代表耗电量(在此示例中)持续减少 10 W 的耗电量。我如何创建一个 model
以消耗 10 W 的方式进行自我调整?
我天真的做法如下:
model ConstantPowerLoad
extends Modelica.Electrical.Analog.Interfaces.OnePin;
parameter Modelica.Units.SI.Power P "The constant power value";
equation
v * p.i = P;
end ConstantPowerLoad;
这没有用,我收到消息“无法使用牛顿求解器求解非线性系统”。可能这是因为当前 i
在启动时为零导致 v * 0 = P
和 v, P > 0
。所以我尝试在电流为零时添加一个初始电阻。但是,这仍然行不通。我得到同样的错误。
model ConstantPowerLoad
extends Modelica.Electrical.Analog.Interfaces.OnePin;
parameter Modelica.Units.SI.Power P "The constant power value";
parameter Modelica.Units.SI.Resistance R_internal = 1e-3 "A dummy resistance on startup";
equation
if p.i == 0.0 then
R_internal * p.i = v;
else
v * p.i = P;
end if;
end ConstantPowerLoad;
我玩了很多if
s和when
s但我就是不明白运行.
我对 Modelica 和此类模拟非常陌生。因此,我真的很感激,不仅是解决方案,还有我在结构上思考的错误,如果可能的话,解释为什么我的代码不起作用。
非常感谢您!
构建可靠的电力负载(或电源)模型并非易事,这可能是 Modelica 标准库中没有此类模型的原因。
问题
电源模型可能根本没有解决方案。在其他情况下有两种解决方案。
无解
您很容易陷入无法汲取请求的力量的境地。您的示例很好地演示了两个麻烦的案例:
由于P=v*i
,电压为零时无法获得所需的功率。随着电流增加到无穷大,接近于零的电压也很麻烦。当然,当我们使用电流源时,电压也会出现类似的问题。
(注意Modelica中没有无穷大,只有一个可能的最大值:Modelica.Constants.inf
,通常定义为1e60)
根据公式Pmax = v^2 / (4*Ri)
,由于Maximum power transfer theorem,与电源串联的电阻限制了最大功率
(不幸的是英文 wiki 文章不是那么好。另见 here or refer to the equivalent wiki article in German)
多个解决方案
串联一个1欧姆的电阻,要求10W,我们可以得到两个解决方案:
P = v*i = 8.87V*1.12A = 10W
在负载上,因此在电阻器上为 1.12V
P = v*i = 1.12V*8.87A = 10W
在负载上,因此在电阻器上为 8.87V
两种解决方案都是正确的。你得到哪一个取决于模拟是如何初始化的。
这里需要start
属性。它初始化状态变量并为非线性迭代设置猜测值(这就是我们这里所拥有的)。
可用型号
有多种可用的实现方式,每种都有各自的优缺点。我可以从脑海中回忆起这两个,但我想还有更多:
DymolaModels 库中的 DC_Power
(免费,随 Dymola 一起提供):其核心使用与 P=v*i
类似的设置。它试图通过将电流和功率限制在一定电压水平以下来规避各种故障。
Loads
SmartElectricDrives 库中的软件包(商业):使用 PI 控制器来获取请求的功率
此特定案例的解决方案
在您的具体示例中,我们可以利用一些事实并为有限范围的应用构建电源:
- 我们知道电压源的内阻。有了功率接收器中可用的这些信息,我们就可以计算出最大功率。
- 我们根据端子处的电压计算电流
- 当电压为零时,我们必须避免被零除。请参阅下面的代码如何执行此操作。要了解发生了什么,我建议阅读事件和预防事件以及运算符
noEvent
。 This link 是一个很好的起点(事实上,整本书都可以推荐给任何开始使用 Modelica 的人)。
这是加载的代码:
model Pload
import Modelica.Units.SI;
extends Modelica.Electrical.Analog.Interfaces.OnePort;
parameter SI.Power Pdes=10 "Desired constant power to draw";
parameter SI.Resistance Ri=1 "Inner resistance of connected circuit";
SI.Power Pload "Maximum power, either limited by Pdes or by maximum power theorem";
equation
Pload = min(Pdes, v^2/(4*Ri));
i = if noEvent(abs(v)>0) then Pload/v else 0;
end Pload;
请注意,此模型只是一个起点。它仅在我们知道 Ri
并且不处理存在两个解决方案的事实时可用。
将其应用于具有 10V 电压斜坡的电路会得到以下结果:
如何实现恒功率负载?
考虑以下电路。这包含一个恒定的功率负载,代表耗电量(在此示例中)持续减少 10 W 的耗电量。我如何创建一个 model
以消耗 10 W 的方式进行自我调整?
我天真的做法如下:
model ConstantPowerLoad
extends Modelica.Electrical.Analog.Interfaces.OnePin;
parameter Modelica.Units.SI.Power P "The constant power value";
equation
v * p.i = P;
end ConstantPowerLoad;
这没有用,我收到消息“无法使用牛顿求解器求解非线性系统”。可能这是因为当前 i
在启动时为零导致 v * 0 = P
和 v, P > 0
。所以我尝试在电流为零时添加一个初始电阻。但是,这仍然行不通。我得到同样的错误。
model ConstantPowerLoad
extends Modelica.Electrical.Analog.Interfaces.OnePin;
parameter Modelica.Units.SI.Power P "The constant power value";
parameter Modelica.Units.SI.Resistance R_internal = 1e-3 "A dummy resistance on startup";
equation
if p.i == 0.0 then
R_internal * p.i = v;
else
v * p.i = P;
end if;
end ConstantPowerLoad;
我玩了很多if
s和when
s但我就是不明白运行.
我对 Modelica 和此类模拟非常陌生。因此,我真的很感激,不仅是解决方案,还有我在结构上思考的错误,如果可能的话,解释为什么我的代码不起作用。
非常感谢您!
构建可靠的电力负载(或电源)模型并非易事,这可能是 Modelica 标准库中没有此类模型的原因。
问题
电源模型可能根本没有解决方案。在其他情况下有两种解决方案。
无解
您很容易陷入无法汲取请求的力量的境地。您的示例很好地演示了两个麻烦的案例:
由于
P=v*i
,电压为零时无法获得所需的功率。随着电流增加到无穷大,接近于零的电压也很麻烦。当然,当我们使用电流源时,电压也会出现类似的问题。 (注意Modelica中没有无穷大,只有一个可能的最大值:Modelica.Constants.inf
,通常定义为1e60)根据公式
Pmax = v^2 / (4*Ri)
,由于Maximum power transfer theorem,与电源串联的电阻限制了最大功率 (不幸的是英文 wiki 文章不是那么好。另见 here or refer to the equivalent wiki article in German)
多个解决方案
串联一个1欧姆的电阻,要求10W,我们可以得到两个解决方案:
P = v*i = 8.87V*1.12A = 10W
在负载上,因此在电阻器上为 1.12VP = v*i = 1.12V*8.87A = 10W
在负载上,因此在电阻器上为 8.87V
两种解决方案都是正确的。你得到哪一个取决于模拟是如何初始化的。
这里需要start
属性。它初始化状态变量并为非线性迭代设置猜测值(这就是我们这里所拥有的)。
可用型号
有多种可用的实现方式,每种都有各自的优缺点。我可以从脑海中回忆起这两个,但我想还有更多:
-
DymolaModels 库中的
DC_Power
(免费,随 Dymola 一起提供):其核心使用与P=v*i
类似的设置。它试图通过将电流和功率限制在一定电压水平以下来规避各种故障。Loads
SmartElectricDrives 库中的软件包(商业):使用 PI 控制器来获取请求的功率
此特定案例的解决方案
在您的具体示例中,我们可以利用一些事实并为有限范围的应用构建电源:
- 我们知道电压源的内阻。有了功率接收器中可用的这些信息,我们就可以计算出最大功率。
- 我们根据端子处的电压计算电流
- 当电压为零时,我们必须避免被零除。请参阅下面的代码如何执行此操作。要了解发生了什么,我建议阅读事件和预防事件以及运算符
noEvent
。 This link 是一个很好的起点(事实上,整本书都可以推荐给任何开始使用 Modelica 的人)。
这是加载的代码:
model Pload
import Modelica.Units.SI;
extends Modelica.Electrical.Analog.Interfaces.OnePort;
parameter SI.Power Pdes=10 "Desired constant power to draw";
parameter SI.Resistance Ri=1 "Inner resistance of connected circuit";
SI.Power Pload "Maximum power, either limited by Pdes or by maximum power theorem";
equation
Pload = min(Pdes, v^2/(4*Ri));
i = if noEvent(abs(v)>0) then Pload/v else 0;
end Pload;
请注意,此模型只是一个起点。它仅在我们知道 Ri
并且不处理存在两个解决方案的事实时可用。
将其应用于具有 10V 电压斜坡的电路会得到以下结果: