如何在Modelica函数中编写双变量导数?报错代码修正求助
问题分析
报错Unexpected assignment left-hand side der(rho_c*h_c). left hand side of assignment must be indexed component references.的核心原因是:Modelica不允许在算法段中对变量表达式的导数直接赋值,der()的左侧必须是单个独立的可微分变量,不能是rho_c*h_c这类组合表达式。你尝试的der(a,b)也不符合Modelica求乘积导数的语法规范。
解决方案
可以通过两种合法方式修正:
方式1:用乘积求导法则展开方程
根据微积分乘积求导公式:der(rho_c*h_c) = rho_c*der(h_c) + h_c*der(rho_c),将原方程替换为展开后的形式,再解出der(h_c)(der(rho_c)已有定义)。
方式2:引入中间变量
定义一个中间变量存储rho_c*h_c的结果,对该中间变量求导,确保der()左侧是合法的单个变量。
修正后的代码(方式1示例)
function SuctionSide input Modelica.Units.SI.Temperature T_c; input Modelica.Units.SI.Temperature T_env; input Modelica.Units.SI.Pressure P_suc; input Modelica.Units.SI.Volume V_f; input Modelica.Units.SI.MassFlowRate mdot_suc; input Modelica.Units.SI.MassFlowRate mdot_2; input Modelica.Units.SI.Mass m_oil; input Modelica.Units.SI.Mass m_wall; input Modelica.Units.SI.Density rho_c; input Modelica.Units.SI.SpecificEnthalpy h_c; input Modelica.Units.SI.SpecificEnthalpy h_2; input Modelica.Units.SI.CoefficientOfHeatTransfer h_rc; input Modelica.Units.SI.CoefficientOfHeatTransfer h_env; input Modelica.Units.SI.HeatFlowRate Qdot_ch; //crankcase heat input Modelica.Units.SI.Area A_c; input Modelica.Units.SI.Area A_env; input Modelica.Units.SI.SpecificHeatCapacityAtConstantPressure Cp_oil; input Modelica.Units.SI.SpecificHeatCapacityAtConstantPressure Cp_wall; input Modelica.Units.SI.Power Wdot_c; input Modelica.Units.SI.Power Wdot_th; input Modelica.Units.SI.HeatFlowRate Qdot_discharge; output Modelica.Units.SI.HeatFlowRate Qdot_c; output Modelica.Units.SI.HeatFlowRate Qdot_m; output Modelica.Units.SI.HeatFlowRate Qdot_env; output Modelica.Units.SI.Temperature T_wall; algorithm // 保留原有rho_c的导数定义 der(rho_c) := (mdot_suc - mdot_2)/V_f; // 展开乘积导数,解出der(h_c),确保der左侧为单个变量 der(h_c) := ( ((mdot_suc*h_c) - (mdot_2*h_2) + Qdot_c + Qdot_ch + (der(P_suc)*V_f))/V_f - h_c*der(rho_c) ) / rho_c; Qdot_c := h_rc * A_c * (T_wall - T_c); der(T_wall) := (Qdot_m + Qdot_discharge - Qdot_c - Qdot_env)/(m_oil * Cp_oil + m_wall * Cp_wall); Qdot_m := Wdot_c + mdot_2 * Wdot_th; Qdot_env := A_env * h_env*( T_wall - T_env); end SuctionSide;
修正说明
- 替换了原有的非法
der(rho_c*h_c)赋值语句,用乘积求导公式展开后得到der(h_c)的合法表达式 - 保留了原有所有方程的业务逻辑,仅修正了导数赋值的语法错误
若选择方式2,只需在函数变量声明区添加protected Modelica.Units.SI.DensitySpecificEnthalpy rho_h_c;(匹配对应单位类型),再在算法段开头添加rho_h_c := rho_c*h_c;,最后将原方程改为der(rho_h_c) := ...即可,本质是把组合表达式包装为单个变量。
内容的提问来源于stack exchange,提问作者Shahzad
相关产品推荐
相关产品推荐

