Могу ли я использовать интерполированные данные в pyomo?

#python #function #interpolation #wolfram-mathematica #pyomo

Вопрос:

У меня есть код pyomo для оптимизации траектории полета самолета. У меня есть реалистичный прогноз ветра от ECMWF. Лучшее решение, которое я могу придумать,-это загрузить данные и построить двумерную интерполяцию Шеннона (для этого я использую mathematica, так как я лучше с ней знаком), как на слайдах 15-18 этой презентации, а затем вставить ее в код Pyomo, который, в свою очередь, выглядит так.

 def Wind_lammda_definition1(model, i):
    return m.Wind_lammda[i,1] ==10.655162991835804*Sinc(6.283185307179586*(-350.   m.lammda[i,1]*180/np.pi))*Sinc(6.981317007977318*(-32.   m.phi[i,1]*180/np.pi))   ...
m.Wind_lammda_const1 = Constraint(m.N, rule = Wind_lammda_definition1)
 

бытие m.lammda и m.phi положение самолета.

Мой вопрос заключается в следующем: есть ли способ уменьшить количество терминов, необходимых для этого двумерного Шеннона? Я использую расширение с тысячами терминов, из которых я показываю только первый. Я хочу знать, могу ли я напрямую интерполировать в python и использовать внутреннюю функцию с положением самолета в pyomo или, если вместо этого я могу, в mathematica использовать более эффективную интерполяцию для вставки в python.

Это код mathematica, который я использую, на всякий случай, если он может быть полезен

 SetDirectory[NotebookDirectory[]];
TX1R = Import["Xnodo_1_of_16.mat"];
stepDivisor1X = 20;
stepDivisor2X = 20;
sinc = Sinc[Pi #] amp; ;
X = Flatten[TX1R[[All, All, 1]]];
Y = Flatten[TX1R[[All, All, 2]]];

xmax = X[[Length[X]]];
xmin = X[[1]];
ymax = Y[[Length[Y]]];
ymin = Y[[1]];
dDeltaXwX = (xmax - xmin)/stepDivisor1X ;(* step *)
dDeltaYwX = (ymax - ymin)/stepDivisor2X;(* step *)
aaa = TX1R //. {x_List} :> x;
tamanio = Dimensions[aaa];
countMax = tamanio[[2]] - 2;
savedX = Table[RandomInteger[i, 5], {i, 1, 5}];
savedX = Table[XposX = aaa[[All, 1]]; YposX = aaa[[All, 2]]; 
   windXVal = aaa[[All, i]];
   windXMat = Transpose[{XposX, YposX, windXVal}];
   ifuncEPSX = Interpolation[windXMat //. {x_List} :> x];
   intDataVectorEPSX = 
    Flatten[Table[{t, u, ifuncEPSX[t, u]}, {t, xmin, xmax, 
       dDeltaXwX}, {u, ymin, ymax, dDeltaYwX}]];
   leEPSX = Length@intDataVectorEPSX;
   vectorXintEPSX = 
    Table[intDataVectorEPSX[[i]], {i, 1, leEPSX - 2, 3}];
   vectorYintEPSX = 
    Table[intDataVectorEPSX[[i]], {i, 2, leEPSX - 1, 3}];
   vectorFintEPSX = Table[intDataVectorEPSX[[i]], {i, 3, leEPSX, 3}];
   interpolatedDataEPSX = 
    Transpose[{vectorXintEPSX, vectorYintEPSX, vectorFintEPSX}];
   shannonInterpolationWindX[t_, u_] = 
    Total[#3*sinc[(t - #1)/dDeltaXwX]*sinc[(u - #2)/dDeltaYwX] amp; @@@ 
      interpolatedDataEPSX], {i, 3, countMax   2}];

For[i = 1, i < lengthLoop   1, i  , 
  savedXTextTemp = ExportString[savedX[[i]], "Text"];
  savedXTextTemp2 = 
   StringReplace[
    savedXTextTemp, {"[" -> "(", "]" -> ")", 
     "t" -> StringJoin["m.lammda[i,1]*180/np.pi"], 
     "u" -> StringJoin["m.phi[i,1]*180/np.pi"]}];
  Print[savedXTextTemp2]; savedXReplaced[[i]] = savedXTextTemp2];

ContourPlot[
 shannonInterpolationWindX[t, u], {t, xmin, xmax}, {u, ymin, ymax}, 
 GridLines -> {{xmax, xmin}, None}, PlotLegends -> Automatic]

ListContourPlot[TX1R //. {x_List} :> x, PlotLegends -> Automatic]