• ベストアンサー

BASICの数値解析(ニュートンラフソン法)について。

 私はプログラミングを始めたばかりの初心者です。学校でいま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

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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

catnapist
質問者

お礼

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

その他の回答 (1)

回答No.1

どのようなエラーか解りませんが、プログラムの基本は 「入力→計算→出力」です。とのような方法でも質問の内容は達成出きると思います。 「一度に列挙」とは「一度に出力」と解せば次のようななります。 「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 あとプログラムの構成は 定数や定義の設定 プログラム本体 サブルーチン(今回は入力部分、計算部分、出力部分) などに分離すると改造・変更などが容易になります。

catnapist
質問者

お礼

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