2013-10-15 1 views
0

이것은 프로그래밍 문제만큼 수학 문제 일 가능성이 높지만 높은 값 (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 

사용하는 법은 블랙 바디 열 손실 계산하는 슈테판 - 볼츠만 법칙이다 :

온도를 - = (방사율 * 시그마 * SurfaceArea * (Temp^4-Amb^4))/SpecificHeat)

이것은 빠른 디버깅을 위해 KSP 플러그인에서 이식되었습니다. Object.update()는 초당 50 회 호출됩니다.

단계별로 코드를 여러 번 실행하지 않는 극한 진동을 방지 할 수있는 해결책이 있습니까?

+1

시간 간격이 해당 방정식의 요소가 아니어야합니까? – Beta

+0

내가 묻는 것을 시뮬레이션하려고 시도했지만 matlib 패키지를 찾을 수 없습니다. 초기화 매개 변수도 유용 할 수 있습니다. – MiooiM

+0

matlib를 호출하는 대신에, self.specificHeat를 450으로 설정하십시오. 코드에서 여분의 모듈을 제거하지 않았습니다. Obj = GeneratorObject (100,0.93, 10, "iron", 0,0,1) self.Warp가 500을 초과하면 일반적으로 범위를 벗어난 오류가 발생합니다. – Calrizan

답변

2

@Beta 및 @ tom10에 의해 이미 암시 된 통합 체계가 좋지 않습니다. 통합 시간 단계는 self.warp 시간 단위 (예 : 실제 단위로 작업 한 이후 self.warp 초)입니다. 이것은 일이 이루어지는 방식이 아닙니다. 먼저 각 항을 일종의 계산 단위로 표현하여 방정식을 무 차원 형식으로 변환해야합니다. 예를 들어 Stefan-Boltzmann 상수와 self.power은 상수가 1 인 단위로 측정 할 수 있습니다. 그런 다음 객체의 특성 시간을 결정해야합니다. 온도가 어느 정도 평형에 도달하는 시간. 그러한 물체가 많은 경우, 모든 특성 시간 중에서 가장 작은 것을 찾아 시간의 측정 단위로 사용해야합니다. 그런 다음 통합 시간 단계는 특성 시간보다 약 1 배 정도 작아야합니다. 그렇지 않으면 미분 방정식에 대한 올바른 해답을 완전히 놓치고 와일드 진동으로 끝납니다.

지금 일어나는 일의 예 : 1kg의 철구를 가져 가자. 3,05,10^(- 3) m^2의 표면적으로 복사 가열/냉각 력은 최대 1,73.10^(- 10) W/K^4이다. self.power이 5kW 인 경우, 복사 전력은 온도가 2319K에 도달 할 때 내부 복사 전력과 동일하며 이는 평형 온도입니다. 낮은 온도에서 복사 가열/냉각은 무시할 만하며 내부 가열만으로 11,1 K/s의 온도 율로 끝납니다. 워프가 1000+ 이상이면 첫 번째 통합 단계에서 11100K 이상의 온도가 발생하며 평형을 5 번 초과합니다. 이제는 복사 에너지가 내부 가열보다 훨씬 더 높으며 1000 배 이상 증가하여 엄청난 냉각 속도로 이어지고 음의 온도로 끝납니다. 그런 다음 부동 소수점 산술 범위를 벗어날 때까지 더 높은 절대 온도로주기가 반복됩니다.

여기에 힌트가 있습니다. self.power이 일정하게 유지되면 방정식에 분석적 해답이 있습니다. 그것을 찾으면 (또는 Maple이나 Mathematica와 같은 도구를 사용하여 찾을 수 있습니다) 그 다음에 솔루션을 플롯합니다. 시스템이 거의 평형 상태에 도달하는 데 걸리는 시간과 솔루션의 시간 규모를 1000 + 단위로 비교 한 시간을 확인하십시오.

+0

이 문제에 도움을 주셔서 감사합니다. dt/dx를 지원하는 방식으로 다시 작성하고 RK4와 같은 호환 가능한 솔루션이 있는지 살펴 보겠습니다. – Calrizan

0

나는 KSP = Kerbal Space Platform을 추측한다. 그래서 나는 이것을 게임 물리학의 문제라고한다. 그렇다면 아마도 같은 질적 행동으로 근사치가 충분할 수도 있습니다. 어쩌면 초기 온도에서 시작하여 주변 온도로 떨어지는 지수 곡선만으로도 충분할 것입니다. 초기에 열전달을 맞추어 감쇠 상수를 선택하십시오.

간혹 근사가 충분할 때도 있습니다. 이것이 그 상황 중 하나인지 나는 모른다.

관련 문제