원본은 수치해석 과목 과제 프린트에 있는 예제용 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
덧글