매틀랩 코드좀 봐주세요..

surnks의 이미지

흠..프로그램은 초기값 설정 한것 보시면 아시겠지만
가운데 네모난 모양의 10이고 나머지는 다 0입니다.
for문에 가운데 10V 값을 준 값은 변하지 않고 나머지 부분에 대해
주위4칸의 v를 이용하여 v를 계산해 나가는 그런 내용입니다.
구간을 나눠서 v를 구하는데요.. 가운데 사각형 위아래 부분과 양옆의 부분
총4부분(가운데사각형제외)으로 나눠서 값을 구하게 됩니다..

아래 코드로 짜면 가운데10V는 변하지 않아야하는데 0이 되어버리네요.. 왜그럴까요?
----------------------------------------------------------------------------
clc;clear all;
t=100; % 3차원행렬의 길이를 임의로 100으로 설정
v=zeros(34,34,t); % (34,34,t)크기의 3차원 행렬을 0으로 초기화 시켜서 만듦
v(14,14:20,1:t)=10;
v(14:20,14,1:t)=10;
v(14:20,20,1:t)=10;
v(20,14:20,1:t)=10; % 초기값(내부사각형의 전압10V) 설정

for k=1:t
for i=2:33
for j=2:13
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;
end
for j=21:33
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;
end
end
for j=14:20
for i=2:13
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;
end
for i=21:33
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;
end
end

b(k+1)=sum(sum(v(:,:,k+1)));
error=abs(b(k+1)-b(k));

if error<0.00001
figure(k)
[C,h]=contour(v(:,:,k))
text_handle = clabel(C,h)

v(:,:,k)
break
end
end
-----------------------------------------------------------------------------------------------------

이거는 if문을 써봤는데요... 이건v가 초기값으로 그냥 나오네요..
위에꺼나 아래꺼나.. 뭔가 틀려서..이럴텐데.. 잘 모르겠어요..
갑자기 배우면서 하다보니...
-----------------------------------------------------------------------------------------------------
clc;clear all;
t=100; % 3차원행렬의 길이를 임의로 100으로 설정
v=zeros(34,34,t); % (34,34,t)크기의 3차원 행렬을 0으로 초기화 시켜서 만듦
v(14,14:20,1:t)=10;
v(14:20,14,1:t)=10;
v(14:20,20,1:t)=10;
v(20,14:20,1:t)=10; % 초기값(내부사각형의 전압10V) 설정

for k=1:t
for i=2:33
for j=2:33
if(i==2:33&j==2:13)
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;

if(i==2:33&j==21:33)
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;

if(i==2:13&j==14:20)
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;

if(i==21:33&j==14:20)
v(i,j,k+1)=(v(i,j-1,k)+v(i-1,j,k)+v(i,j+1,k)+v(i+1,j,k))/4;
end
end
end
end
end
end

b(k+1)=sum(sum(v(:,:,k+1)));
error=abs(b(k+1)-b(k));

if error<0.00001
figure(k)
[C,h]=contour(v(:,:,k))
text_handle = clabel(C,h)

v(:,:,k)
break
end

end
------------------------------------------------------------------------------

snowall의 이미지

for문 루프 돌리는데서 계산이 틀리는 것 같군요. 그러니까, for문이 계산할 때 가운데 사각형은 피해서 가야 하는데 그냥 다 계산해 버리는 것 같습니다.

제 코딩 철학은 돌아가기만 하면된다는 것이기 때문에, 저라면 1회 루프를 돌아갈 때마다 경계조건을 다시 설정할 겁니다. 가운데 사각형이 10이라는 값을 유지할 필요가 있다면, 계산 돌릴 때마다 10을 대입해 버리면 되겠죠.

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

auditory의 이미지

초기값 설정이 잘못된것 같습니다.

% 초기값(내부사각형의 전압10V) 설정

한 직후에 imagesc(v(:,:,1)) 해보시면

내부가 10으로 설정된게 아니라,

테두리만 10으로 설정되고 내부는 0으로 설정된걸 보실 수 있을 겁니다.

surnks의 이미지

에.. 가운데 네모 테두리만 10V로 한게 맞습니다^^;;

auditory의 이미지


처음코드로 돌리면..
가운데네모테두리는 그냥 10으로 나오던데요..
값이 변한다는 확인은 어떻게 하셨는지??

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.