You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写内嵌二维表格的Modelica/Dymola函数?含外部文件需求

解决Modelica函数实现二维查表(含外部文件读取)

问题根源

你之前的代码报错,是因为Modelica.Blocks.Tables.CombiTable2Ds是仿真用的模型组件,只能在model/block中实例化,不能直接在function里使用。函数需要用Modelica标准库提供的函数式查表接口——Modelica.Tables.Interpolation.CombiTable2D。

方案1:内嵌表格的函数实现

直接在函数中定义表格数据,适合数据量小的场景:

function InputTable
  input Real a "第一个输入变量";
  input Real b "第二个输入变量";
  output Real c "查表结果";
protected
  // 表格格式说明:
  // 第一列 = u1(输入a的网格点)
  // 第一行 = u2(输入b的网格点)
  // 剩余区域 = 对应输出值矩阵
  Real table[:, :] = [0,   40000, 152500, 265000;
                      250, 423315,419889, 416118;
                      273.5,441261,438806,436236];
  // 提取输入网格和输出数据矩阵
  Real u1[:] = table[:, 1];
  Real u2[:] = table[1, 2:end];
  Real data[:, :] = table[2:end, 2:end];
algorithm
  // 调用函数式查表接口,支持线性插值和外推设置
  c := Modelica.Tables.Interpolation.CombiTable2D(
    u1=u1, 
    u2=u2, 
    y=data, 
    u1_input=a, 
    u2_input=b,
    extrapolation=Modelica.Tables.Interpolation.Extrapolation.Extrapolate);
annotation (uses(Modelica(version="4.0.0")));
end InputTable;

测试模型

model TestInputTable
  Real a = 250;
  Real b = 152500;
  Real c;
equation
  c = InputTable(a, b);
end TestInputTable;

方案2:读取外部CSV文件(适合大数据量)

如果数据量庞大,将表格保存为CSV文件(比如table_data.csv),然后在函数中读取:

CSV文件内容示例

0,40000,152500,265000
250,423315,419889,416118
273.5,441261,438806,436236

函数代码

function InputTableFromCSV
  input Real a "第一个输入变量";
  input Real b "第二个输入变量";
  input String fileName = "table_data.csv" "CSV文件路径(同目录直接写文件名,否则用绝对路径)";
  output Real c "查表结果";
protected
  // 读取CSV文件为二维数组
  Real table[:, :] = Modelica.Utilities.Streams.readMatrix(fileName);
  Real u1[:] = table[:, 1];
  Real u2[:] = table[1, 2:end];
  Real data[:, :] = table[2:end, 2:end];
algorithm
  c := Modelica.Tables.Interpolation.CombiTable2D(
    u1=u1, 
    u2=u2, 
    y=data, 
    u1_input=a, 
    u2_input=b,
    extrapolation=Modelica.Tables.Interpolation.Extrapolation.Extrapolate);
annotation (uses(Modelica(version="4.0.0")));
end InputTableFromCSV;

方案3:读取外部MAT文件(MATLAB/Modelica格式)

如果数据存储在MAT文件中,需确保文件包含三个实数数组:u1(输入a的网格点)、u2(输入b的网格点)、data(输出值矩阵,维度为size(u1) × size(u2))。

函数代码

function InputTableFromMAT
  input Real a "第一个输入变量";
  input Real b "第二个输入变量";
  input String fileName = "table_data.mat" "MAT文件路径";
  output Real c "查表结果";
protected
  // 加载MAT文件中的变量
  Real u1[:] = Modelica.Utilities.Files.loadMatFileReal(fileName, "u1");
  Real u2[:] = Modelica.Utilities.Files.loadMatFileReal(fileName, "u2");
  Real data[:, :] = Modelica.Utilities.Files.loadMatFileReal(fileName, "data");
algorithm
  c := Modelica.Tables.Interpolation.CombiTable2D(
    u1=u1, 
    u2=u2, 
    y=data, 
    u1_input=a, 
    u2_input=b,
    extrapolation=Modelica.Tables.Interpolation.Extrapolation.Extrapolate);
annotation (uses(Modelica(version="4.0.0")));
end InputTableFromMAT;

关键注意事项

  • 外推设置:extrapolation参数可选择Extrapolate(外推)或HoldLastPoint(保持端点值),根据需求调整。
  • 文件路径:读取外部文件时,若文件不在模型/函数所在目录,需填写绝对路径(比如"C:/data/table_data.csv")。
  • 表格维度:确保data矩阵的行数等于u1的长度,列数等于u2的长度,否则会报错。

内容的提问来源于stack exchange,提问作者Shahzad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:41:00