問題タブ [systemmodeler]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
235 参照

events - Modelicaでブールスイッチを使用して、在庫がゼロ以下にならないようにする方法は?

問題の説明

Modelica でのモデリングのようなシステム ダイナミクス (SD)をサポートするライブラリを構築しています。Cellierらによる無料で入手可能なライブラリとは異なります。非因果的コネクタをうまく利用できると確信しています。コネクタを介してストック値を「潜在的」として送信することで、コンパクトなコンポーネント (フロー = プロセスなど) を構築できます。

SD では、材料 (「質量」) の在庫と、マイナスになる可能性のある情報在庫を区別することができます。これをサポートするために、質量ポートに次の定義を使用しています(ここで a の定義を与えますStockPort- その対応する a はFlowPort、単に出力変数の代わりにブール入力変数を持ち、後で与えられます):

ブールスイッチは、ストックのポートごとに、充填または排出が許可されているかどうかを示します。

材料在庫」の場合、stopOutflowスイッチは在庫がゼロ以下にならないようにする必要があります。残念ながら、次の例ではこれはうまくいきません:在庫はゼロをわずかに下回って排出されます。

コネクタを使用した最小限の例

以下TestModelでは、これらのビルディング ブロックを使用します。

  • function constrainedRate( indicated rate, stopInflow, stopOutflow)指定された制約 (つまり、ブール スイッチ) に準拠するレートを返すために使用されます。

  • connector StockPort上記のように

  • connector FlowPortに対応するStockPort
  • model MaterialStockStockPortゼロ以下で排出できないストックコンポーネント
  • model LinearDecline接続されたストックを一定の速度 (ここでは 1 に設定) で排出することをモデル化するフロー要素FlowPort(つまり、シンク) を持つフロー要素

なモデルは、単純に を開始しstock、それがで直線的に減少initialValue = 5する に接続されています。processdeclineRate = 1

StartTime = 0からまでのDASSL を使用してモデルをシミュレートするStopTime = 10と、変数 の予想される動作が明らかになりますstock.outflow.stock

株価

残念ながら、以降は値がわずかにゼロを下回っていますt = 5.0

どういうわけか、イベント (在庫値 <= 0) の検出が遅すぎます。私に何ができる?

(これまでのところ、最も洗練されていない治療法は、whenイベント (状態イベント) を使用して株式の値をゼロにすることでした。ステートメントとブール条件でラッパーreinitを使用した私の実験も成功していません。)noEventif

0 投票する
1 に答える
108 参照

runtime-error - パラメータを使用してコンポーネントのユニット属性を設定できますか?

これまでのところ、Wolfram System Modeler 4.3および5.1を使用すると、次の最小限の例はエラーなしでコンパイルされます:

しかし、WSM 12.0 の新しいリリースでは (バージョンのジャンプは、Wolfram のフラグシップである Mathematica の現在のリリースとの調整によるものです)、次のエラー メッセージが表示されます。

内部エラー: Codegen.getValueString: 非定数式: c.hasUnit

(注: WSMLink'WSMSimulateSystem Modeler 12.0 を内部で実行している Mathematica 12.0 でエラーが発生します。ここでは"InternalValues"、WSM 12.0 をインストールしていないため、上記のモデルのプロパティを要求しています)。

OpenModelica [OMEdit v. 1.13.2 (64-bit)] で上記のモデルをシミュレートしようとすると、次のことが明らかになります。

SimCodeUtil.mo: 8492:9-8492:218]: 内部エラー 予期しない式 (おそらくフロントエンドで処理されているはずです。ユニット/displayUnit 式は文字列リテラルではありません: c.hasUnit

ユニット属性を設定するために、パラメータの可変性を持つ変数を使用できないようですか? これはなぜですか - 結局のところ、実行時にコンパイルするときにコンパイラがユニットをハードワイヤできるだけで十分ではないのでしょうか?

編集:私の古い質問への回答から、少なくとも最終的なパラメーターを使用してユニット属性を設定できると信じていました。変更を最終的にします (たとえばc( final hasUnit = "myUnit" )、問題は解決しません。