C言語でニュートン法を用いた方程式の近似解を求めるプログラム

このQ&Aのポイント
  • C言語でニュートン法を用いて、方程式x^3(xの3乗)-4=0の近似解を求めるプログラムです。実数解との誤差は0.0001以下とします。
  • プログラムは、初期値を入力し、ニュートン法を使って近似解を求めます。方程式の導関数は3x^2(3*xの二乗)です。
  • プログラムの流れは、初期値を設定し、近似解を計算する過程を繰り返し行います。最終的に近似解が求められます。
回答を見る
  • ベストアンサー

C言語のプログラムについて

下記は、何言語かわからないです。 これをC言語にするにはどうすればよいでしょうか。 プログラムは、「ニュートン法を用いて、方程式x^3(xの3乗)-4=0の近似解を求めるプログラム。ただし、実数解と、近似解の誤差は、0.0001以下とする。ここで、この方程式の導関数は、3x^2(3*xの二乗)である。」 100 DEF F(X)=X*X*X-4 110 DEF G(X)=3*X*X 120 INPUT PROMPT "初期値":A 130 LET B=A-F(A)/G(A) 140 IF ABS(A-B)<=.0001 THEN 170 150 LET A=B 160 GOTO 130 170 PRINT "近似解";B 180 END 以上です。 ご回答よろしくお願いいたします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

これはBASICですね。それも、Visual Basicのような新しいものではなく、昔からあるやつ。パソコンが電源ONでROMから起動してたころの。今だと十進BASICが該当するでしょうか。 このタイプのBASICの変数の型を考えたら、明示されていないものには整数は使わないで、浮動小数点型にするのが妥当。floatってことになるんだろうけど、特に理由が無ければdoubleを使うのが、誤差が少なくてよい。 とうぜん、INPUTで入力する値も実数だろうからatoiは使えない。手を抜くならscanfで。 DEF は関数の定義だけど、式で表せる程度の単純なものしか定義できない。 LETは代入で、省略可能なことが多い。 IF ABS(A-B)<=.0001 THEN 170 って書き方のときは、 ~THEN GOTO 170の意味。 ベタ移植すればこんな感じ #include <stdio.h> #include <math.h> double F(double X) { return X*X*X-4;} double G(double X) { return 3*X*X;} int main() { double A,B ; L120: printf("初期値:") ; scanf("%lf",&A); /* INPUT PROMPT "初期値":A */ L130: B=A-F(A)/G(A) ; /* LET B=A-F(A)/G(A) */ L140: if ( fabs(A-B) <= .0001 ) { goto L170 ; } /* IF ABS(A-B)<=.0001 THEN 170 */ L150: A=B ; /* LET A=B */ L160: goto L130 ; /* GOTO 130 */ L170: printf("近似解: %g\n" , B) ; /* PRINT "近似解";B */ L180: return 0 ; /* END */ }

その他の回答 (1)

  • Mzi
  • ベストアンサー率38% (5/13)
回答No.1

そのBASICをC言語に変換したら以下のようになると思う。 >|c| #define F(X) X*X*X-1 #define G(X) 3*X*X int main ( int argc, char *argv[] ){     char a;     char b[10];     int i, A;     printf( "初期値:" );     i=0;     while ((a = getchar()) != EOF) {         b[i] = a;         i++;     }     b[i] = (char)0;     A = atoi( b );     float B=0;     while( abs( a-b ) > .0001 ){         B=A-F(A)/G(A);     }     printf( "近似解: %f\r\n", B );     return 0; }

関連するQ&A

  • C言語のプログラムの問題で質問です。

    C言語のプログラムの問題で質問です。 問題は、 与えられた実数(a,b,c,d)に対して、次の連立非線形方程式の解 を「ニュートン法」を用いて解く。 f1(x,y)=y+ax^2-b=0 f2(x,y)=y^2+cx^2-d=0 ただし初期値(a,b,c,d)を入力でき、上記の方程式の解が画面表示されること。 という問題です。 普通の連立方程式を解くプログラムならできるのですが、ニュートン法 で解くというのが分かりません。 プログラムを教えてください。参考にしたいです。

  • ニュートン法をC言語でプログラム

    方程式 cos^2x-0.5=0 (0<x<π) の解をニュートン法で求める という問題をC言語のプログラムを作り計算したいのですが分かりません。 自分で考えてみたプログラムは以下の通りです。 #include <stdio.h> #include <math.h> #define f1(x) cos(x)*cos(x)-0.5 #define f2(x) sin(2*x) /* ニュートン法による方程式の解 */ main() { double x0,x1,a,b,c,d,g,n; a=1; x0=0.7; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解 x= %f \n", a,x1); x0=x1; } } 自分としてはこれが精一杯で、何故間違ってるのか、何をどうすればいいのか、さっぱり分かりません。どういったところが間違ってるのか可能性だけでも示して頂ければ幸いです。 参考として、ニュートン法によるプログラム例として書かれていたものを上げさせて頂きます。 例: e^x-3=0 の解をニュートン法により計算する。 #include <stdio.h> #include <math.h> #define f1(x) exp(x)-3 #define f2(x) exp(x) /* ニュートン法による方程式の解 */ main() { double x0,x1,e,a,b,c,d,g,n; a=1; x0=3; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解  x= %f \n", a,x1); x0=x1; } }

  • C言語のプログラムの問題で質問です。

    C言語のプログラムの問題で質問です。 問題は、 与えられた実数(a,b,c,d)に対して、次の連立非線形方程式の解 を「ニュートン法」を用いて解く。 f1(x,y)=y+ax^2-b=0 f2(x,y)=y^2+cx^2-d=0 ただし初期値(a,b,c,d)を入力でき、上記の方程式の解が画面表示されること。 という問題です。まず、どういう方針で作っていくのかが分かりません。 できるのなら参考例を挙げてもらえればありがたいです。お願いします。

  • C言語で非線形方程式を解くプログラム

    非線型方程式((a*a)+(x*x))(1-x)-bx=0 という式で a=0.07,b=0.10のときの解をすべて解きなさい(プログラムで2分法又はニュートン法を用いて解く)という問題を解きたいのですが色々なサイトを見てもわかりません もしよろしければどなたか教えていただけませんか? よろしくお願いします。

  • C言語 二分法 プログラム

    C言語での二分法の解法になやんでいます。 f(x)=X2乗-2でf(x)=0の解を2分法により求める場合のプログラムを教えて下さい。 収束条件|ak-bk|<10^-6と|f(ck+1)|<10^-6のいずれかを満足。また、解を求める過程として、k,ak,bk,|ak-bk|, ck+1, f(ck+1) (k=0,1,2,3...)も示してくれないでしょうか。よろしくお願いします。 注: a,b,cに付属するk,k+1はa,b,cの下側に付く小文字です。(a1,a2... ak, ak+1. b1 b2... bk, bk+1)

  • C言語プログラミングで困っています。助けて下さい。

    C言語プログラミングで困っています。助けて下さい。 課題1-1: 実数 a と実数 b を入力すると、一次方程式ax + b = 0 の解を求めるプログラムを作る 課題1-2: 1-1 で作成したプログラムについて、さらにa として1が入力されたとき、方程式の表示       部分が1x + 3 = 0ではなくx + 3 = 0となるようにせよ 課題1-3: 1-2 で作成したプログラムについて、さらにb として0 や負の数が入力されたとき、方程式     の表示部分が2x = 0 や2x – 3 = 0となるようにせよ 課題1-4: 1-3 で作ったプログラムについて、さらにa の値として0が入力された場合、「解けません」     と表示するようにせよ 課題1-5: 係数 a, b, c を入力すると、 2次方程式ax2 + bx + c =0の解を表示するプログラムを作     れ ※ 1-2 ~ 1-4 のような機能を盛り込む ※ a が0の場合には、先に作った1次方程式のプログラムが動く という問題です。最終的にこれらを一つのプログラムにしてください。判別式や解の公式、ルート√などを使ってよろしくお願いします。C言語でお願いします

  • ニュートン法を使って解を求めるC言語プログラム

    C言語を使って y=x^2-4x のyの解をニュートン法を使って求める プログラムを作る課題を出されたんですが、ニュートン法が良く分かっていないので、いろいろ調べたり、人に聞いたりしたところ #include<stdio.h> #include<math.h> void main() { int counter=0; double an,g,f,sh=0.0001; printf("初期値を入力して下さい==>"); scanf("%ld",&an); do{ g=(an*an)/(2*an-4); f=2*an-4; counter++; }while(fabs(f)>sh); printf("反復回数 %d 回 y=%lf \n",counter,g); } でプログラムがこんな感じになったんですが、結局ニュートン法がどうなのかがわかりません。 なんか微分とかやるとか言われたんですが、工業系の学校で数学の授業が無いので微分についてがわかりません。 このプログラムは、コンパイルはできるんですが、動きません。 ニュートン法についてよくわからないのでどこが間違ってるかわかりません。 ニュートン法についてできるだけ分かりやすく解説してほしいです。

  • オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法のC言語プログラムに

    オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法のC言語プログラムについて教えてください! 課題なのですが、まったくわからず困ってます>< 1 常微分方程式 dy/dx=f(x,y),y(0)=1 の数値解をオイラー法を用いて計算するプログラムを作為せよ。ただし、f(x,y)=3-6x^2-4x+2xyとする。 2 α=1,β=1,γ=1/2,σ=1/2 の場合の2次ルンゲクッタ法を考える。1と同じ常微分方程式(f(x,y)も同じ)を考え、その数値解を求めるプログラムを作成せよ。また、オイラー法と2次ルンゲクッタ法の実行結果を示して、2つの近似精度を比較せよ。 3 1と同じ常微分方程式(f(x,y)も同じ)を考え、その数値解を4次ルンゲクッタ法を使って求めるプログラムを作成せよ。また、オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法の実行結果を示して、3つの近似精度を比較せよ。 以上の3つです。 休んでいた自分が悪いのですが、ネットで調べてもよくわからなくて… わかる方、よろしくおねがいします…

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

    これはニュートン法で√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

  • 最小二乗法 ニュートン法

    ニュートン法で最小二乗法を使うとき、x+Δxを近似解として、テイラー展開して f(x+Δx)=f(x)+f’(x)Δx この式から新しい近似解を得ると思います。 この時のfは何の関数なのでしょうか? 残差の二乗和でいいのでしょうか? わかる方お願いします。

専門家に質問してみよう