【问题标题】:Can JModelica print results directly to file?JModelica 可以将结果直接打印到文件中吗?
【发布时间】:2015-08-15 18:58:11
【问题描述】:

我正在运行以下 JModelica 脚本:

#!/usr/local/jmodelica/bin/jm_python.sh
import pyjmi
op = pyjmi.transfer_optimization_problem("BatchReactor", "model.mop")

opt_opts                                 = op.optimize_options()
opt_opts['n_e']                          = 40 # Number of elements
opt_opts['IPOPT_options']['tol']         = 1e-10
opt_opts['IPOPT_options']['print_level'] = 8
opt_opts['IPOPT_options']['output_file'] = '/z/out'

res = op.optimize(options=opt_opts)

我曾希望将结果(例如时间、x1、x2 等)打印到文件 /z/out。但该文件仅包含 IPOPT 详细调试/状态信息。

有没有办法将res 中存储的信息直接打印到文件中?要么通过某种方式编写 res 本身,要么最好让 IPOPT/JModelica 编写结果而不必通过 Python?

【问题讨论】:

    标签: python modelica jmodelica


    【解决方案1】:

    有一种方法可以将信息直接打印到文件中。以下实现了这一点。请注意,result_file_name 是实现这一目标的关键。

    #!/usr/local/jmodelica/bin/jm_python.sh
    import pyjmi
    op = pyjmi.transfer_optimization_problem("BatchReactor", "model.mop")
    
    opt_opts                                 = op.optimize_options()
    opt_opts['n_e']                          = 40 # Number of elements
    opt_opts['result_file_name']             = '/z/out'
    opt_opts['IPOPT_options']['tol']         = 1e-10
    opt_opts['IPOPT_options']['print_level'] = 0
    
    res = op.optimize(options=opt_opts)
    

    不幸的是,文件的内容有些神秘。

    【讨论】:

      【解决方案2】:

      您可能会发现,在此处使用 result_file_name per another answer 会导致输出文件为 difficult to understand

      以下产生更好的格式:

      import StringIO
      import numpy as np
      
      def PrintResToFile(filename,result):
        def StripMX(x):
          return str(x).replace('MX(','').replace(')','')
      
        varstr = '#Variable Name={name: <10}, Unit={unit: <7}, Val={val: <10}, Col={col:< 5}, Comment="{comment}"\n'
      
        with open(filename,'w') as fout:
          #Print all variables at the top of the file, along with relevant information
          #about them.
          for var in result.model.getAllVariables():
            if not result.is_variable(var.getName()):
              val = result.initial(var.getName())
              col = -1
            else:
              val = "Varies"
              col = result.get_column(var.getName())
      
            unit = StripMX(var.getUnit())
            if not unit:
              unit = "X"
      
            fout.write(varstr.format(
              name    = var.getName(),
              unit    = unit,
              val     = val,
              col     = col,
              comment = StripMX(var.getAttribute('comment'))
            ))
      
          #Ensure that time variable is printed
          fout.write(varstr.format(
            name    = 'time',
            unit    = 's',
            val     = 'Varies',
            col     = 0,
            comment = 'None'
          ))
      
          #The data matrix contains only time-varying variables. So fetch all of
          #these, couple them in tuples with their column number, sort by column
          #number, and then extract the name of the variable again. This results in a
          #list of variable names which are guaranteed to be in the same order as the
          #data matrix.
          vkeys_in_order = map(lambda x: x[1], sorted([(result.get_column(x),x) for x in result.keys() if result.is_variable(x)]))
      
          for vk in vkeys_in_order:
            fout.write("{0:>13},".format(vk))
          fout.write("\n")
      
          sio = StringIO.StringIO()
          np.savetxt(sio, result.data_matrix, delimiter=',', fmt='%13.5f')
          fout.write(sio.getvalue())
      

      看起来像这样:

      #Variable Name=S0        , Unit=kg     , Val=2.0       , Col=-1   , Comment="Solid Mass"
      #Variable Name=F0        , Unit=kg     , Val=0.0       , Col=-1   , Comment="Fluid Mass"
      #Variable Name=a         , Unit=Hz     , Val=0.2       , Col=-1   , Comment="None"
      #Variable Name=b         , Unit=kg/s   , Val=1.0       , Col=-1   , Comment="None"
      #Variable Name=f         , Unit=kg/s   , Val=0.05      , Col=-1   , Comment="None"
      #Variable Name=h         , Unit=1/g    , Val=0.05      , Col=-1   , Comment="None"
      #Variable Name=der(F)    , Unit=X      , Val=Varies    , Col= 1   , Comment="None"
      #Variable Name=F         , Unit=kg     , Val=Varies    , Col= 3   , Comment="None"
      #Variable Name=der(S)    , Unit=X      , Val=Varies    , Col= 2   , Comment="None"
      #Variable Name=S         , Unit=kg     , Val=Varies    , Col= 4   , Comment="None"
      #Variable Name=u         , Unit=X      , Val=Varies    , Col= 5   , Comment="None"
      #Variable Name=startTime , Unit=X      , Val=0.0       , Col=-1   , Comment="None"
      #Variable Name=finalTime , Unit=X      , Val=100.0     , Col=-1   , Comment="None"
      #Variable Name=time      , Unit=s      , Val=Varies    , Col= 0   , Comment="None"
               time,       der(F),       der(S),            F,            S,            u,
            0.00000,      0.97097,     -0.97097,      0.00000,      2.00000,      0.97097
            0.38763,      1.07704,     -1.05814,      0.38519,      1.61698,      1.00000
            1.61237,      0.88350,     -0.80485,      1.70714,      0.35885,      0.65862
            2.50000,      0.00000,      0.09688,      2.14545,      0.00000,      0.00000
            2.88763,      0.09842,     -0.00000,      2.18330,      0.00000,      0.06851
            4.11237,      0.10342,      0.00000,      2.30688,      0.00000,      0.07077
            5.00000,      0.10716,      0.00000,      2.40033,      0.00000,      0.07240
            5.38763,      0.10882,     -0.00000,      2.44219,      0.00000,      0.07311
            6.61237,      0.11421,      0.00000,      2.57875,      0.00000,      0.07535
      

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多