Search code examples
interpolationmodelicaopenmodelicadymola

What is the problem with this model ? 4D matrix interpolation


I want to create a 4d matrix and interpolate. Dymola shows me this error for all interp values.

interpX1 (line 40, column 10: erstellte_Bauteile.QuadriLinearInterpolation)

Expected one of:
";"
","
"]"
")"
"}"
"constrainedby"
"annotation"
"if"
string-literal
operator
"for"
"loop"
"then"
"else" 
":"
"("
"["
"."


interpX2 (line 41, column 10: erstellte_Bauteile.QuadriLinearInterpolation)

Expected one of:
";"
","
"]"
")"
"}"
"constrainedby"
"annotation"
"if"
string-literal
operator
"for"
"loop"
"then"
"else" 
":"
"("
"["
"."


ERRORS have been issued.

I don't know how to solve the errors.

model CombinedInterpolationModel
  model QuadriLinearInterpolation
    parameter Real matrix[:,:,:,:]; // Die 4D-Matrix
    parameter Integer X;
    parameter Integer Y;
    parameter Integer Z;
    parameter Integer W;

    Real x_in(start=0);
    Real y_in(start=0);
    Real z_in(start=0);
    Real w_in(start=0);

    output Real interpValue;

  protected
    Integer i;
    Integer j;
    Integer k;
    Integer l;

    Real wx;
    Real wy;
    Real wz;
    Real ww;

  algorithm
    // Finde die nächstliegenden Indizes
    i := floor(x_in);
    j := floor(y_in);
    k := floor(z_in);
    l := floor(w_in);

    // Berechne die Gewichtungsfaktoren
    wx := x_in - i;
    wy := y_in - j;
    wz := z_in - k;
    ww := w_in - l;

    // Führe die lineare Interpolation in jeder Dimension durch
    Real interpX1 = (1 - wx) * matrix[i, j, k, l] + wx * matrix[i+1, j, k, l];
    Real interpX2 = (1 - wx) * matrix[i, j+1, k, l] + wx * matrix[i+1, j+1, k, l];
    Real interpY1 = (1 - wy) * interpX1 + wy * interpX2;

    Real interpX3 = (1 - wx) * matrix[i, j, k+1, l] + wx * matrix[i+1, j, k+1, l];
    Real interpX4 = (1 - wx) * matrix[i, j+1, k+1, l] + wx * matrix[i+1, j+1, k+1, l];
    Real interpY2 = (1 - wy) * interpX3 + wy * interpX4;

    Real interpZ1 = (1 - wz) * interpY1 + wz * interpY2;

    Real interpX5 = (1 - wx) * matrix[i, j, k, l+1] + wx * matrix[i+1, j, k, l+1];
    Real interpX6 = (1 - wx) * matrix[i, j+1, k, l+1] + wx * matrix[i+1, j+1, k, l+1];
    Real interpY3 = (1 - wy) * interpX5 + wy * interpX6;

    Real interpX7 = (1 - wx) * matrix[i, j, k+1, l+1] + wx * matrix[i+1, j, k+1, l+1];
    Real interpX8 = (1 - wx) * matrix[i, j+1, k+1, l+1] + wx * matrix[i+1, j+1, k+1, l+1];
    Real interpY4 = (1 - wy) * interpX7 + wy * interpX8;

    Real interpZ2 = (1 - wz) * interpY3 + wz * interpY4;

    // Führe die finale Interpolation durch
    interpValue := (1 - ww) * interpZ1 + ww * interpZ2;
  end QuadriLinearInterpolation;

  QuadriLinearInterpolation interpolation(
    matrix = { 10,10,10,10/* Eingabe der Matrix */ },
    X = 2,
    Y = 2,
    Z = 3,
    W = 4);

  Real x_in(start=0.5);
  Real y_in(start=0.5);
  Real z_in(start=1.5);
  Real w_in(start=2.5);

  Real interpolatedValue;

equation
  // Benutze das Interpolation model
  x_in = 0.5; // input values
  y_in = 0.5;
  z_in = 1.5;
  w_in = 2.5;

  // Verwendung interpolation model
  interpolatedValue = interpolation.interpValue;

end CombinedInterpolationModel;


Solution

  • You cannot declare variables in the algorithm section. I moved the declarations to the proctected section.

    Note that while is possible to parse the model, it will not work until you feed it a proper 4D matrix, {10, 10, 10, 10} is just a 1 dimension vector. If you want those to be the dimensions of the matrix, then you need to make them parameters and modify them when you define the interpolation component (as you do for X for example). Or just use matrix = fill(0, 10, 10, 10, 10) as I did. As there were no equations for x_in, y_in, z_in and w_in in QuadriLinearInterpolation model, I added the modification interpolation(x_in = x_in, y_in = y_in, z_in = z_in, w_in = w_in). No idea if this is what you intended, you can change the code to what you want. It compiles and simulates now. Note that you could have used a function instead of a model for QuadriLinearInterpolation.

    model CombinedInterpolationModel
      model QuadriLinearInterpolation
        parameter Real matrix[:,:,:,:]; // Die 4D-Matrix
        parameter Integer X;
        parameter Integer Y;
        parameter Integer Z;
        parameter Integer W;
    
        Real x_in(start=0);
        Real y_in(start=0);
        Real z_in(start=0);
        Real w_in(start=0);
    
        output Real interpValue;
    
      protected
        Integer i;
        Integer j;
        Integer k;
        Integer l;
    
        Real wx;
        Real wy;
        Real wz;
        Real ww;
        
        Real interpX1;
        Real interpX2;
        Real interpY1;
        Real interpX3;
        Real interpX4;
        Real interpY2;
        Real interpZ1;
        Real interpX5;
        Real interpX6;
        Real interpY3;
        Real interpX7;
        Real interpX8;
        Real interpY4;
        Real interpZ2;
    
      algorithm
        // Finde die nächstliegenden Indizes
        i := integer(floor(x_in));
        j := integer(floor(y_in));
        k := integer(floor(z_in));
        l := integer(floor(w_in));
    
        // Berechne die Gewichtungsfaktoren
        wx := x_in - i;
        wy := y_in - j;
        wz := z_in - k;
        ww := w_in - l;
    
        // Führe die lineare Interpolation in jeder Dimension durch
        interpX1 := (1 - wx) * matrix[i, j, k, l] + wx * matrix[i+1, j, k, l];
        interpX2 := (1 - wx) * matrix[i, j+1, k, l] + wx * matrix[i+1, j+1, k, l];
        interpY1 := (1 - wy) * interpX1 + wy * interpX2;
    
        interpX3 := (1 - wx) * matrix[i, j, k+1, l] + wx * matrix[i+1, j, k+1, l];
        interpX4 := (1 - wx) * matrix[i, j+1, k+1, l] + wx * matrix[i+1, j+1, k+1, l];
        interpY2 := (1 - wy) * interpX3 + wy * interpX4;
    
        interpZ1 := (1 - wz) * interpY1 + wz * interpY2;
    
        interpX5 := (1 - wx) * matrix[i, j, k, l+1] + wx * matrix[i+1, j, k, l+1];
        interpX6 := (1 - wx) * matrix[i, j+1, k, l+1] + wx * matrix[i+1, j+1, k, l+1];
        interpY3 := (1 - wy) * interpX5 + wy * interpX6;
    
        interpX7 := (1 - wx) * matrix[i, j, k+1, l+1] + wx * matrix[i+1, j, k+1, l+1];
        interpX8 := (1 - wx) * matrix[i, j+1, k+1, l+1] + wx * matrix[i+1, j+1, k+1, l+1];
        interpY4 := (1 - wy) * interpX7 + wy * interpX8;
    
        interpZ2 := (1 - wz) * interpY3 + wz * interpY4;
    
        // Führe die finale Interpolation durch
        interpValue := (1 - ww) * interpZ1 + ww * interpZ2;
      end QuadriLinearInterpolation;
    
      QuadriLinearInterpolation interpolation(
        matrix = fill(0, 10, 10, 10, 10) /* Eingabe der Matrix */,
        X = 2,
        Y = 2,
        Z = 3,
        W = 4,
        x_in = x_in,
        y_in = y_in,
        z_in = z_in,
        w_in = w_in);
    
      Real x_in(start=0.5);
      Real y_in(start=0.5);
      Real z_in(start=1.5);
      Real w_in(start=2.5);
    
      Real interpolatedValue;
    
    equation
      // Benutze das Interpolation model
      x_in = 0.5; // input values
      y_in = 0.5;
      z_in = 1.5;
      w_in = 2.5;
    
      // Verwendung interpolation model
      interpolatedValue = interpolation.interpValue;
    
    end CombinedInterpolationModel;