プロが教えるわが家の防犯対策術!

 私はプログラミングを始めたばかりの初心者です。学校でいまbasicを勉強しています。BASIC経験者の方、もしくはプログラミングに詳しい方よろしければお願いしたします。

(以下質問)
 ニュートン・ラフソン法を用いて根を求めるプログラムについてですが、与えられた式
 f(X)=X^2-333=0
で試行値:X0=1,5,10,50,100,500と変えていくとき(*RUN一回のみ)の解が求められないです。試行値を個々に与えて(INPUT6回)求めることはできました。ですが一度に列挙することができません。
 私がやってみました方法は
1)試行値を関数(数列化)にしてみる。
2)元々の関数を関数(数列化)にしてみる。
3)IF文もしくはREAD文を用いる。
の3つですが、どの方法を取ってもエラーが止みません><。
 基本的なことでしたら申し訳ないのですが、アドバイス、方針、対処策等教えて頂けたら嬉しいです。なお現在までにできているプログラムを書いておきたいと思います。ご参考ください。

(以下プログラム)
120 REM*******ニュートン・ラフソン法*********
130 N=1
140 INPUT"試行値は";X0:
145 PRINT X0
150 ER=.00001
180 FX=X0*X0-333
190 DFX=2*X0
200 X1=X0-FX/DFX
220 IF ABS(X1-X0)<ER THEN 250
230 X0=X1 :N=N+1
240 GOTO 180
250 PRINT X1,N
280 END

A 回答 (2件)

ちょっと書き換えてみました、こんな感じでどうでしょう


120 REM*******ニュートン・ラフソン法*********
130 FOR I = 1 TO 6
132 READ X0
134 GOSUB 140
136 NEXT I
138 END
140 PRINT "試行値は";X0
145 N=1
150 ER=.00001
180 FX=X0*X0-333
190 DFX=2*X0
200 X1=X0-FX/DFX
220 IF ABS(X1-X0)<ER THEN 250
230 X0=X1 :N=N+1
240 GOTO 180
250 PRINT X1,N
280 RETURN
300 REM *************試行値*************
310 DATA 1,5,10,50,100,500
    • good
    • 0
この回答へのお礼

DIM文で解をすべて求めることは出来ましたが、その場合、収束回数が累計で出てきていましたが、BLUEPIXYさんのプログラムでやってみたところ個々に対応した収束回数も表示できました。RETURN+GOSUBのサブルーチンはこのように使えばいいのですね。とても勉強になりました、有難うございました。

お礼日時:2006/05/20 21:10

どのようなエラーか解りませんが、プログラムの基本は


「入力→計算→出力」です。とのような方法でも質問の内容は達成出きると思います。

「一度に列挙」とは「一度に出力」と解せば次のようななります。
「6回入力→6回計算→6回出力」そのほか「6回繰り返し(入力→計算)→6回出力」などもあります。ここでは始めの手順を取ります。

各3つの部分が分離していますので入力値と出力値を保存する必要があり、一般的には配列変数を使うことになります。
以下では感じからN88-BASIC(86)と仮定して。

(以下プログラム)
120 REM*******ニュートン・ラフソン法*********
  DEFDBL A-Z 'すべての変数を培精度実数にする(何もしないと単精度実数になっていて素人考えでは数値計算には向かないのでは?)
  SN%=6 'サンプル数
  DIM VIN[SN%] '入力値を格納
  DIM VOUT[SN%] '出力値を格納
  DIM VCOUNT%[SN%] '計算回数を格納
  '---入力---
  FOR I%=1 TO SN%
140  PRINT USING "##番目の試行値は";I%;
   INPUT;VIN[I%]  'INPUTは使用しなかったので記述の仕方は忘れました(^^;)
145  PRINT VIN[I%]
  NEXT
  '---計算---
150 ER=.00001# 'ER=.00001
  FOR I%=1 TO SN%
130  N%=0 'N=1
   X1=VIN[I%]
   X0=X1+ER*100# '判定の都合で、元のIF文なら不要だった
   WHILE ABS(X1-X0)>=ER
230   X0=X1 :N%=N%+1
180   FX=X0*X0-333
190   DFX=2*X0
200   X1=X0-FX/DFX
240  WEND  'GOTO 180
   VOUT[I%]=X1 : VCOUNT%[I%]=N%
  NEXT
  '---表示---
  FOR I%=1 TO SN%
250  PRINT VOUT[I%],VCOUNT%[I%]
  NEXT
280 END

あとプログラムの構成は

定数や定義の設定
プログラム本体
サブルーチン(今回は入力部分、計算部分、出力部分)

などに分離すると改造・変更などが容易になります。
    • good
    • 0
この回答へのお礼

DIM文、サブルーチン等参考になりました。ご丁寧な回答有難うございました。

お礼日時:2006/05/20 21:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!