Processing으로 시뮬레이션~열전도
12300 단어 processing시뮬레이션
소개
Processing을 사용하여 열전도를 시뮬레이션합니다.
열전도 방정식
시간에 따라 변화하는 온도의 분포를 가르쳐 주는 방정식입니다.
온도 $T(x,t)$ 는 시간과 위치의 함수입니다.
\frac{\partial T}{\partial t} = k \frac{\partial ^2 T}{\partial x^2}
차분화·이산화
차이로 변환합니다.
\frac{1}{Δt}(T(x,t+Δt) - T(x,t)) = k\frac{1}{Δx^2}(T(x+Δx,t)-2T(x,t)+T(x-Δx,t))
이산화
Δt = 1, t = 0,1,2, ...
Δx=1, x=0,1,2,...,len
합니다.
T(x,t+1) - T(x,t) = k(T(x+1,t)-2T(x,t)+T(x-1,t))
t=0일 때
T(x,1) = T(x,0) + k(T(x+1,0)-2T(x,0)+T(x-1,0))
$T(x,0)$ 는 초기 조건입니다. 시간 0에서의 온도 분포입니다.
$T(x,1)$ 는 1시간 진행된 온도 분포입니다.
x가 0~len의 범위를 취하면 $x(-1,t),x(len+1,t)$의 데이터가 필요합니다. 이것은 경계 조건이 됩니다.
Processing으로 시각화
서모그래피와 같은 색칠
HSB 컬러 모드를 사용하여 Hue 값을 0%~68%까지 사용하면 0%가 적색, 68%가 청색이 됩니다.
고온을 빨강, 저온을 파랑으로 색칠합니다.
void setup()
{
size(680, 120);
int step = 100;
PImage img = createImage(step, 1, RGB);
colorMode(HSB, step*100/68, 100, 100);
noSmooth();
for (int i=0; i<step; i++) {
img.pixels[i] = color(i+1, 100, 100);
}
img.updatePixels();
image(img, 0, 0, width, height);
}
시뮬레이션
t1은 현재 온도 분포이고 t0은 1시간 전의 온도 분포입니다.
xmin은 가장 왼쪽의 온도이고 xmax는 오른쪽 끝의 온도입니다. 초기 조건은 모두 온도 0입니다.
오른쪽이 고온, 왼쪽이 저온으로 되어 있고, 온도가 오른쪽에서 왼쪽으로 이동합니다.
float k = 0.5;
float[] t0;
float[] t1;
float xmin;
float xmax;
PImage img;
int step = 100;
void setup() {
size(640, 100);
init();
noSmooth();
frameRate(60);
}
void draw() {
for (int i=0; i<step; i++) {
img.pixels[i] = color(255-t1[i], 100, 100);
}
img.updatePixels();
image(img, 0, 0, width, height);
for (int i=0; i<10; i++) // speed up
updateTime();
}
void init()
{
t0 = new float[step];
t1 = new float[step];
xmin = 0;
xmax = 255;
img = createImage(step, 1, RGB);
colorMode(HSB, 255*100/68, 100, 100);
}
void updateTime()
{
for (int i=0; i<step; i++) {
t0[i] = t1[i];
}
t1[0] = t0[0] + k * (xmin - 2 * t0[0] + t0[1]);
for (int i=1; i<step-1; i++) {
t1[i] = t0[i] + k * (t0[i-1] - 2 * t0[i] + t0[i+1]);
}
t1[step-1] = t0[step-1] + k * (t0[step-2] - 2 * t0[step-1] + xmax);
}
Reference
이 문제에 관하여(Processing으로 시뮬레이션~열전도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tobira-code/items/4546a91025cab7bc8d7b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
시간에 따라 변화하는 온도의 분포를 가르쳐 주는 방정식입니다.
온도 $T(x,t)$ 는 시간과 위치의 함수입니다.
\frac{\partial T}{\partial t} = k \frac{\partial ^2 T}{\partial x^2}
차분화·이산화
차이로 변환합니다.
\frac{1}{Δt}(T(x,t+Δt) - T(x,t)) = k\frac{1}{Δx^2}(T(x+Δx,t)-2T(x,t)+T(x-Δx,t))
이산화
Δt = 1, t = 0,1,2, ...
Δx=1, x=0,1,2,...,len
합니다.
T(x,t+1) - T(x,t) = k(T(x+1,t)-2T(x,t)+T(x-1,t))
t=0일 때
T(x,1) = T(x,0) + k(T(x+1,0)-2T(x,0)+T(x-1,0))
$T(x,0)$ 는 초기 조건입니다. 시간 0에서의 온도 분포입니다.
$T(x,1)$ 는 1시간 진행된 온도 분포입니다.
x가 0~len의 범위를 취하면 $x(-1,t),x(len+1,t)$의 데이터가 필요합니다. 이것은 경계 조건이 됩니다.
Processing으로 시각화
서모그래피와 같은 색칠
HSB 컬러 모드를 사용하여 Hue 값을 0%~68%까지 사용하면 0%가 적색, 68%가 청색이 됩니다.
고온을 빨강, 저온을 파랑으로 색칠합니다.
void setup()
{
size(680, 120);
int step = 100;
PImage img = createImage(step, 1, RGB);
colorMode(HSB, step*100/68, 100, 100);
noSmooth();
for (int i=0; i<step; i++) {
img.pixels[i] = color(i+1, 100, 100);
}
img.updatePixels();
image(img, 0, 0, width, height);
}
시뮬레이션
t1은 현재 온도 분포이고 t0은 1시간 전의 온도 분포입니다.
xmin은 가장 왼쪽의 온도이고 xmax는 오른쪽 끝의 온도입니다. 초기 조건은 모두 온도 0입니다.
오른쪽이 고온, 왼쪽이 저온으로 되어 있고, 온도가 오른쪽에서 왼쪽으로 이동합니다.
float k = 0.5;
float[] t0;
float[] t1;
float xmin;
float xmax;
PImage img;
int step = 100;
void setup() {
size(640, 100);
init();
noSmooth();
frameRate(60);
}
void draw() {
for (int i=0; i<step; i++) {
img.pixels[i] = color(255-t1[i], 100, 100);
}
img.updatePixels();
image(img, 0, 0, width, height);
for (int i=0; i<10; i++) // speed up
updateTime();
}
void init()
{
t0 = new float[step];
t1 = new float[step];
xmin = 0;
xmax = 255;
img = createImage(step, 1, RGB);
colorMode(HSB, 255*100/68, 100, 100);
}
void updateTime()
{
for (int i=0; i<step; i++) {
t0[i] = t1[i];
}
t1[0] = t0[0] + k * (xmin - 2 * t0[0] + t0[1]);
for (int i=1; i<step-1; i++) {
t1[i] = t0[i] + k * (t0[i-1] - 2 * t0[i] + t0[i+1]);
}
t1[step-1] = t0[step-1] + k * (t0[step-2] - 2 * t0[step-1] + xmax);
}
Reference
이 문제에 관하여(Processing으로 시뮬레이션~열전도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tobira-code/items/4546a91025cab7bc8d7b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
\frac{1}{Δt}(T(x,t+Δt) - T(x,t)) = k\frac{1}{Δx^2}(T(x+Δx,t)-2T(x,t)+T(x-Δx,t))
T(x,t+1) - T(x,t) = k(T(x+1,t)-2T(x,t)+T(x-1,t))
T(x,1) = T(x,0) + k(T(x+1,0)-2T(x,0)+T(x-1,0))
서모그래피와 같은 색칠
HSB 컬러 모드를 사용하여 Hue 값을 0%~68%까지 사용하면 0%가 적색, 68%가 청색이 됩니다.
고온을 빨강, 저온을 파랑으로 색칠합니다.
void setup()
{
size(680, 120);
int step = 100;
PImage img = createImage(step, 1, RGB);
colorMode(HSB, step*100/68, 100, 100);
noSmooth();
for (int i=0; i<step; i++) {
img.pixels[i] = color(i+1, 100, 100);
}
img.updatePixels();
image(img, 0, 0, width, height);
}
시뮬레이션
t1은 현재 온도 분포이고 t0은 1시간 전의 온도 분포입니다.
xmin은 가장 왼쪽의 온도이고 xmax는 오른쪽 끝의 온도입니다. 초기 조건은 모두 온도 0입니다.
오른쪽이 고온, 왼쪽이 저온으로 되어 있고, 온도가 오른쪽에서 왼쪽으로 이동합니다.
float k = 0.5;
float[] t0;
float[] t1;
float xmin;
float xmax;
PImage img;
int step = 100;
void setup() {
size(640, 100);
init();
noSmooth();
frameRate(60);
}
void draw() {
for (int i=0; i<step; i++) {
img.pixels[i] = color(255-t1[i], 100, 100);
}
img.updatePixels();
image(img, 0, 0, width, height);
for (int i=0; i<10; i++) // speed up
updateTime();
}
void init()
{
t0 = new float[step];
t1 = new float[step];
xmin = 0;
xmax = 255;
img = createImage(step, 1, RGB);
colorMode(HSB, 255*100/68, 100, 100);
}
void updateTime()
{
for (int i=0; i<step; i++) {
t0[i] = t1[i];
}
t1[0] = t0[0] + k * (xmin - 2 * t0[0] + t0[1]);
for (int i=1; i<step-1; i++) {
t1[i] = t0[i] + k * (t0[i-1] - 2 * t0[i] + t0[i+1]);
}
t1[step-1] = t0[step-1] + k * (t0[step-2] - 2 * t0[step-1] + xmax);
}
Reference
이 문제에 관하여(Processing으로 시뮬레이션~열전도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tobira-code/items/4546a91025cab7bc8d7b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)