0

これはプログラミングの問題であると同時に数学の問題である可能性がありますが、以下のコードで warp が高い値 (1000+) に設定されている場合、クラスメソッド「update()」で温度の深刻な振動に遭遇しているようです. 簡単にするために、すべての温度はケルビン単位です。

(私は本職のプログラマーではありません。この形式はおそらく不快です。)

import math

#Critical to the Stefan-Boltzmann equation. Otherwise known as Sigma
BOLTZMANN_CONSTANT = 5.67e-8

class GeneratorObject(object):
    """Create a new object to run thermal simulation on."""
    def __init__(self, mass, emissivity, surfaceArea, material, temp=0, power=5000, warp=1):
        self.tK = temp                                                  #Temperature of the object.     
        self.mass = mass                                                #Mass of the object.
        self.emissivity = emissivity                                    #Emissivity of the object. Always between 0 and 1.
        self.surfaceArea = surfaceArea                                  #Emissive surface area of the object.
        self.material = material                                        #Store the material name for some reason.
        self.specificHeat = (0.45*1000)*self.mass                       #Get the specific heat of the object in J/kg (Iron: 0.45*1000=450J/kg)
        self.power = power                                              #Joules/Second (Watts) input. This is for heating the object.
        self.warp = warp                                                #Warp Multiplier. This pertains to how KSP's warp multiplier works.

    def update(self):
        """Update the object's temperature according to it's properties."""
        #This method updates the object's temperature according to heat losses and other factors.
        self.tK -= (((self.emissivity * BOLTZMANN_CONSTANT * self.surfaceArea * (math.pow(self.tK,4) - math.pow(30+273.15,4))) / self.specificHeat) - (self.power / self.specificHeat)) * self.warp

使用される法則は、黒体熱損失を計算するためのステファン・ボルツマンの法則です。

温度 -= (放射率*シグマ*表面積*(温度^4-周囲^4))/比熱)

これは、より迅速なデバッグのために KSP プラグインから移植されました。Object.update() は 1 秒あたり 50 回呼び出されます。

ステップごとにコードを複数回実行することを伴わない、これらの極端な振動を防ぐための解決策はありますか?

4

2 に答える 2

2

@ Beta と @ tom10 によってすでに示唆されているように、あなたの統合スキームは悪いです。統合タイムステップはself.warp時間単位、つまりself.warp物理単位で作業してからの秒数です。これは物事が行われる方法ではありません。まず、各項をある種の計算単位で表現して、方程式を無次元形式に変換する必要があります。たとえば、ステファン・ボルツマン定数とself.powerは、定数が 1 の単位で測定できます。次に、オブジェクトの特徴的な時間を決定する必要があります。たとえば、温度がある程度平衡温度に達するまでの時間です。このようなオブジェクトが多数ある場合は、すべての特徴的な時間の中で最小のものを見つけて、それを時間の測定単位として使用する必要があります。次に、積分時間ステップは、特性時間よりも約 1 桁小さい必要があります。そうしないと、微分方程式の正しい解を完全に見逃して、野生の振動が発生します。

何が起こるかの例: 1 kg の鉄の球を考えてみましょう。表面積が 3,05.10^(-3) m^2 の場合、放射加熱/冷却電力は最大 1,73.10^(-10) W/K^4 です。とself.power5 kW に等しい場合、温度が 2319 K に達したときの放射出力は内部出力と等しくなり、それが平衡温度です。低温では、放射加熱/冷却は無視でき、内部加熱のみでは 11,1 K/s の温度率になります。ワープが 1000+ の場合、最初の統合ステップで 11100 K 以上の温度になり、平衡を 5 回オーバーシュートします。現在、放射エネルギーは内部加熱よりも桁違いに高く、巨大な冷却速度につながります.1000以上を掛けると、負の温度になります. そして、浮動小数点演算の範囲外に達するまで、絶対温度がどんどん高くなるというサイクルが繰り返されます。

ここにヒントがあります。self.powerが一定に保たれている場合、方程式には解析解があります。それを見つけて (または Maple や Mathematica などのツールを使用して見つけて)、解をプロットします。1000 単位以上のタイムステップが解のタイムスケールとどのように比較されるかを確認してください。つまり、システムがほぼ平衡状態に達するまでにかかる時間です。

于 2013-10-16T11:55:50.453 に答える
0

KSP = Kerbal Space Platform だと思いますので、これはゲームの物理学の問題だと思います。もしそうなら、おそらく同じ質的挙動による近似で十分でしょう。おそらく、初期温度から始まり周囲温度まで下がる指数曲線で十分でしょう。初期時間の熱伝達を一致させることにより、減衰定数を選択します。

概算で十分な場合もあります。これがそのような状況の 1 つであるかどうかはわかりません。

于 2013-10-24T15:54:17.560 に答える