プログラム作成アドバイス下さい(初心者)

このQ&Aのポイント
  • N88互換BASICのフリーソフトにて正の実数aの平方根を求めるプログラムをニュートンラプソン法で組む問題です。
  • 入力した定数aに対して、ニュートンラプソン法を用いて平方根を求めるプログラムを作成しています。
  • 具体的な手順として、初期値X0にaを代入し、X1を求め、その差を用いて相対誤差を求めます。収束判定定数EPSとの比較を行い、収束したかどうか判断します。最終的に求めた平方根を表示します。
回答を見る
  • ベストアンサー

プログラム作成アドバイス下さい(初心者)

N88互換BASICのフリーソフトにて作成しています。 正の実数aの平方根ルートa(a^1/2)をニュートンラプソン法で求めるプログラムを組む問題です。下記が手順です。 1、定数aを入力(a>0)、今回解くべき方程式は、f(x)=x^2-a=0であるから、その導関数はf(x)=2xである。 2、初期値X0にaを代入し、X1を求める。 3、X0とX1から、相対誤差E=|(X1-X0)/X0|を求める。 4、X1とEを画面表示する。 5、収束判定定数EPSの値を10^-5とし、これと相対誤差を比較する。 6、EがEPSより大きければ、得られた根は収束が足りないと思われるので、次のX2を求める。(2、へ移動) EがEPSより小さければ、十分な精度で収束したと考え、7へ。 7、最後にSQR(a)を画面表示して終了。 とりあえず下記のように進めましたが続きが分かりません。続きはどのような計算ですか? 10 Rem 正の実数a平方根a^1/2を、ニュートン・ラプソン法で求めるプログラムを組む問題。 20 Cls 30 Print "正の実数の平方根を求めます。" 40 EPS = 0.00001 50 INPUT "a=";A 60 IF A<=0 THEN END ELSE GOTO 70 70 Print "a="; 80 Print USING; "#.####^^^^"; A 面倒なプログラムですが、宜しくお願いします。

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

  • ベストアンサー
回答No.1

手順1~7のうち、1の半分までできているようですね。 ニュートン法ですから、x1=x0-f(x0)/f'(x0)を計算してx0とx1がほぼ同じ値になるまで繰り返します。繰り返すときは、今計算したx1をx0に入れて次のx1を計算するわけです。 参考まで。 100 rem 正の実数aの平方根ルートa(a^1/2)をニュートンラプソン法で求めるプログラムを組む問題 110 rem 1、定数aを入力(a>0)、今回解くべき方程式は、f(x)=x^2-a=0であるから、その導関数はf'(x)=2xである。 120 input "a=? ",a 130 if a<=0 goto 120 140 rem 2、初期値X0にaを代入し、X1を求める。 150 x0 = a 160 fx = x0^2-a 170 ffx = 2*x0 180 x1 = x0-fx/ffx 190 rem 3、X0とX1から、相対誤差E=|(X1-X0)/X0|を求める。 200 e=abs((x1-x0)/x0) 210 rem 4、X1とEを画面表示する。 220 print "X1=";x1,"E=";e 240 rem 5、収束判定定数EPSの値を10^-5とし、これと相対誤差を比較する。 250 rem 6、EがEPSより大きければ、得られた根は収束が足りないと思われるので、次のX2を求める。(2、へ移動) 260 rem EがEPSより小さければ、十分な精度で収束したと考え、7へ。 270 if e >= 10E-05 then x0=x1:goto 160 280 rem 7、最後にSQR(a)を画面表示して終了。 290 print "SQR(";a;")=";x1 300 end

astro26
質問者

お礼

毎回面倒なプログラムのアドバイス有難うございます。 とても助かります。感謝致します。 200のe=abs((x1-x0)/x0)の「abs」と、290のprint "SQR(";a;")=";x1の「SQR」は何を示しているのでしょうか? 今後、まだ質問があるかと思いますが、アドバイスを頂けると光栄です。

その他の回答 (1)

回答No.2

「abs」 absは絶対値(absolution value)を計算します。 相対誤差は負になる場合もあるので、収束判定する場合は絶対値の計算が必要です。 「SQR」 print文のなかで"に囲まれているので、単純に文字列ですが、もともとの意味は、平方根(square root)です。 BASICではsqr(2)と書けば√2の値を計算してくれるsqr関数もあるのですが・・・

astro26
質問者

お礼

絶対値と平方根の意味だったのですね。 絶対値はabsではなく、||のバーで挟んでも結果表示されるんでしょうか。 ありがとうございました。

関連するQ&A

  • 初心者です。

    f(x)=x^2-a=0の根を求めよという問題です。 収束判定が|x*x-a|<epsで・・・。 恥ずかしい話、さっぱり分からないです。 学校の授業でやっているんですが、どうも好きではなく理解できていない状態です・・・ 先生の説明も、一体何を言ってるんだ?という感じで。 必修だから仕方が無くという感がものすごくあって。 どのような式(?)にすればいいのでしょうか?? お願いしますm(__)m

  • C言語のプログラム作成で・・・

    NaOH 濃度を入力すると、水酸化ナトリウム水溶液の pH を出力するプログラム(naoh.c)を作成せよ。 NaOH の解離度は、1.0 とし、Kw=1.0x10-14 [(mol/dm3)2] とする。 という問題でプログラムは #include <stdio.h> #include <math.h> main() { float fx,dfx,x,x0,eps,Kw,C,pH,x_an,pH_an; int i; Kw=1.0e-14; printf("x0="); scanf("%f",&x0); printf("C="); scanf("%f",&C); i=1; eps=fabs(x0*x0+C*x0-Kw); while ( eps > C/1e8 ) { fx=x0*x0+C*x0-Kw; dfx=2*x0+C; x = x0 - fx/dfx; eps=fabs(fx); printf("i=%3d fx=%.4e eps=%.4e x=%.4e\n",i,fx,eps,x); x0=x; i=i+1; } としました。そこで次に、濃度 Ca [mol/l] の塩酸 Va [ml]と濃度 Cb [mol/l] のNaOH水溶液 Vb [ml]を混ぜた溶液のpH を計算するプログラムを作成せよ。 という問題が出たのですがどうやって作成すればいいのでしょうか? HCl,NaOH の解離度は、1.0 とし、Kw=1.0x10-14 [(mol/dm3)2] とするらしいです。 めんどくさいと思いますがお願いします。

  • BASIC数値解析プログラムについて。

    初めまして、私は大学でBASIC初心者でN88互換BASICでのプログラミングを今年から勉強しています。↓のプログラムで収束過程の計算結果を実行画面に表示させたくてFOR~NEXT文でいろいろ試しているのですがエラーが出てしまいます。他の具体的な方法が浮かばないです。初歩的な質問でしたら申し訳ないのですが、BASIC経験者、もしくは現在やられている方でどなたか私にアドバイスをしていただけると助かります。 (x^2-a=0のaの根を求めるニュートン法のプログラムです) 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

  • プランク定数の相対誤差について

    プランク定数の相対誤差をしらべてみると、単位によって大きさが違うのですが、これはなぜなのでしょうか? たとえば、2010年CODATA推奨値の場合、J・s単位だと相対誤差は 4.4×10^-8 なのに、eV・s単位だと2.2×10^-8 になっています。 単に単位を変えただけなのに、誤差が減ったり増えたりしてしまうのは不思議なのですが・・・。単位を変換するときに、素電荷eの相対誤差2.2x10^-8が入るか入らないか、ということなのでしょうか?しかし、それだと誤差がなぜ2乗和でなくて単純な和になっているのかがわからないです。両者は相関もないですし。 ご存知の方がいらっしゃったら教えていただければ幸いです。 Wikipediaのプランク定数のページ http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%83%B3%E3%82%AF%E5%AE%9A%E6%95%B0

  • プログラミング ニュートン法簡単な例の説明が欲しい

    これはニュートン法で√nを求めるプログラムですけど このプログラムを一行ずつ説明してもいいですか? DEF f(x)=x^2-a DEF g(x)=2*x ! g(x)=f'(x) PRINT "input" INPUT a LET x=a LET E=EPS(1)*10 <----これは何? DO  LET x1=x-f(x)/g(x)  PRINT x1   IF ABS((x1-x)/x)<E THEN EXIT DO  LET x=x1 LOOP END

  • このプログラムがうまく作動しないのですが・・・

    #include <stdio.h> #include <math.h> #include <stdlib.h> float f(float x); float f(float x) { return (float)(x-sin(x)/cos(x)); } void main() { float x1,x2,eps,f1,f2,xm,ff; int i; printf("Bisection method\n\n"); for(;scanf("%g%g%g",&x1,&x2,&eps)!=EOF;){ f1= f(x1); f2= f(x2); if(f1>0){ xm= x1; x1= x2; x2=xm; ff= f1; f1= f2; f2=ff; } printf("\nFinding a root between x1=%g and x2=%g\n", x1, x2); printf("f(x1)=%g f(x2)=%g eps=%g\n", f1, f2, eps); printf("\tx1\t\tx2\t\txm\t\tf(xm)\n"); if(f2<0){ printf("????\n"); continue; } i= 0; for(;fabs(x1-x2)>=eps;){ xm=(x1+x2)*((float)rand()/(float)RAND_MAX) ff= f(xm); i++; printf("%2d %15.6e %15.6e %15.6e %15.6e\n",i, x1, x2, xm, ff); if(ff<0) x1= xm; else x2= xm; } printf("A root found between %g and %g\n", x1, x2); } } f(x)=x-tanx=0の解のうち3つを表示させるためにランダムサーチのプログラムを上記のように書いたつもりなんですがうまく作動しません。どこをどう直したらいいのでしょうか、教えてください。

  • BASIC数値解析の収束過程計算結果の表示法について。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=2172518ここの質問の訂正です。↓のプログラムで収束過程の計算結果を実行画面に表示させるように改良したいのですが、具体的な方法がわからないです。たとえば試行値1の場合ですと、収束回数が9回ですが、収束1回ごとの計算結果を表示させたいです。 (x^2-a=0のaの根を求めるニュートン法のプログラムです。収束した結果は表示できます。) 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

  • ルートと平方根の違い

    過去の質問をある程度洗わせて頂いて大体のところは理解できたのですが、確認と、いくつか細かい疑問が出てきたので質問させて頂きます。 *この質問中において、xは実数、aは正の実数、iは虚数単位とします。 確認事項 1.平方根と√(ルート)は違うもの 平方根は2乗してxになる2つの数(±x^(1/2)=±a)を表したもので、ルートは平方根のうち正の数(x^(1/2)=a)を表す 例:2の平方根は±2、√(4)=2 2.ルートの計算で、y=f(x)=√(x)^2としたとき、y=x 例:√(4)^2=4 3.√(a^2)はa、√((-a)^2)もa 例:√(2^2)=2、√((-2)^2)=2 ここで質問です。 上の3項はいずれも複素数を考えない場合(x≧0)に成り立つ性質だと思います。そこで、複素数を含めた考え方をすると… 1.x<0の時、xの平方根、ルートはどうなるのか? 平方根は±aiとできる気がしますが、ルートはそもそも正の数という概念がaiに適応できるのかどうか? 2.√(-a)^2はどうなるのか? 一瞬√(-a)^2=-aと思ってしまったのですが、-a<0のためルートの定義から外れます。複素数を経由しても √(-a)^2=(√(a)i)^2=√(a)^2・i^2=-a となり、同じくルートの定義から外れます。 *ここで複素数のルートに対して虚数単位の係数が正の方を採用しましたが、これは定義がいまいちわかっていないため、間違っている可能性があります。 3.よく√(x^2)=xとしている記述が見られるが、正確には√(x^2)=|x|ではないか? 様々な式変形でこのようなルートの外し方が見られますし、実際僕も前者の様に思っていましたが、正解は後者ではないでしょうか?となると前者を前提とした式変形は間違っていた、という事になるのでしょうか? よくわかっていない部分がありますので全く見当違いな事を言っているかもしれません。その辺も含めて教えて下さるとうれしいです。 よろしくお願い致します。

  • C言語で表記についの質問です

    C言語です。 exp(x)のテイラー展開を数値計算で求めるプログラムですが、 プログラムでは相対打ち切り誤差をEPSと定義しています。 具体的には double myexp(double x){ double EPS=1e-08; double s=1.0,e=1.0,d; int k; for(k=1;k<=200;k++){ d=s; e=e*x/k; s=s+e; if(fabs(s-d)<EPS*fabs(d)) return s; } と上の様に書かれています。 わからない点は上記のプログラムでEPS=1e-08のeは10の意味をしているでしょうか?EPS=10^-8理解 してよろしいでしょうか? またEPSのeと二つ目のe=1.0は全く異なるものでしょうか。 ご教授よろしくお願いします。

  • プログラムの作成

    講義で与えられたテキストを見ながら作ろうとしたのですが実行できません。お願いします。 プログラムはCで作成すること。 与えられた実数a,bに対し、次の定積分 S=∫xのa乗(1-x)のb乗dx (積分範囲は0~1) の値を台形法により近似的に求めるプログラムを作成してください。 ただし、実数a,b、区間の分割数は実行時にキーボードから入力できるように

専門家に質問してみよう