これはプログラミングの問題であると同時に数学の問題である可能性がありますが、以下のコードで 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 回呼び出されます。
ステップごとにコードを複数回実行することを伴わない、これらの極端な振動を防ぐための解決策はありますか?