근사적으로 방정식의 해를 구하는 프로그램(ruby)

원본은 수치해석 과목 과제 프린트에 있는 예제용 C 프로그램(...)

원래 프로그램 내에 정해져 있는 방정식에다 구간을 주고 중간값의 정리를 이용해 푸는 프로그램이었는데, ruby로 옮기면서 명령줄 인수로 사용자가 방정식을 주고 근사 해를 구하는 것으로 바꾸었습니다.
ruby는 완전히 까먹었다가, 최근에 얇은 책 한권 빌려서 앞부분만 잠깐 보고 짜 봤는데 그래도 그럭저럭 돌아가네요.
제대로 된 지식도 없이 무식하게 C에서 옮긴거라 소스는 완전 엉망입니다만, 이런게 돌아간다는 것 자체가 ruby의 간편함을 보여주는 듯 합니다.

혼돈을 엽니다



arg = ARGV.length
$a = Array.new()
$b = Array.new()
ai=0
bi=0
for i in 0...arg do
if ((i%2)==0) then
$a[ai]=ARGV[i].to_f
ai+=1
else
$b[bi]=ARGV[i].to_f
bi+=1
end
end

def f(x)
y=0
for j in 0...($a.length) do
y+=$a[j]*(x**$b[j])
end
return y
end

ARGV.clear

TOL = 0.00000001
MAXSTEP = 100000000

print "input the lower bound :"
low = gets.to_f
print "input the upper bound :"
up = gets.to_f
print "\n"

if((f(low)*f(up))>0) then
puts "설정된 구간 내에서 해가 없다."
exit
end
step = 1

while(step<MAXSTEP) do
center = low+(up-low)/2
if((f(center)==0) || ((up-low)/2<TOL))
print "solution is x=", center, "\n"
exit
end
step+=1

if((f(low)*f(center))>0) then
low=center
else
up=center
end

print "Step :", step," solution is x= ", center,"\n"
end

print "fail step :", step




맨 아래 닫기


인수로 3 3 -7 2를 줬는데, 이건 3x^3-7x^2를 나타낸 겁니다.
해가 어디쯤 있는지 짐작할 수 없었으므로 찾을 범위는 무조건 크게 주고(...ㅡㅡ)

결과. 엑셀로 돌려보니까 대충 비슷하게 맞네요.

그런데 명령줄 인수가 있는 상태에서 gets으로 표준입력을 받으니 무조건 에러가 나더군요.
일단 ARGV.clear로 명령줄 인수를 날리고 난 뒤 입력을 받는걸로 해결은 했는데, 왜 이렇게 될까요?

ps. 그러고보니 내일까지 자바 과제 내야 되는데, 이게 왠 딴짓이지... 자바는 피곤해요ㅠㅠ
ps2. 근데, 프로그래밍보다 소스코드를 이글루에 올리는게 더 힘들어요 OTL

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://hcno.egloos.com/tb/5554285 [도움말]

핑백

  • 북쪽하늘 별자리 : 2011년 내 이글루 결산 2012-01-01 14:45:00 #

    ... 2위: 일상(33회) | 솔로 9000일 돌파 3위: 도서(14회) | 본격 명작 SF 까기 - 링 월드 4위: IT(7회) | 근사적으로 방정식의 해를 구하는 프로그램(r... 5위: 과학(6회) | 섣부름에 대한 섣부른 이야기 가장 많이 읽힌 글은 세벌식을 권장하지 못하는 ... 입니다. 가장 대 ... more

덧글

댓글 입력 영역