- 締切済み
C言語課題(数値計算)お願いします。
課題内容 ニュートン法を用いて√2の値を求められるプログラムを作る。 10ケタまで表示する。 書いてみたソースコード #include <stdio.h> #include <stdlib.h> #include <math.h> #define max 1000 //最大繰り返し回数 #define eps 1.0e-10 //収束条件 double f(double x); double df(double x); void newton(void); int main() { newton(); return 0; } void newton(void) { int count; double a,newa; count=0; printf("初期値を入力してください。\n"); scanf("%lf",&a); for(;;) { count++; newa=a-f(a)/df(a); if(fabs(newa-a)<eps) break; a=newa; if(count==max) { printf("収束しませんでした。\n"); exit(1); } } printf("解の値は %f\n収束するのに %d 回かかりました。\n", newa,count); } double f(double x) { return x*x-2; } double df(double x) { return 2x; } コンパイルできません。 間違いとどうすればよいかを教えていただけるとありがたいです!!!
- goukaku63
- お礼率53% (8/15)
- C・C++・C#
- 回答数3
- ありがとう数0
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- KEIS050162
- ベストアンサー率47% (890/1879)
これで試してみてください。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 1000 //最大繰り返し回数 #define EPS 1.0e-10 //収束条件 double f( double x ) { return( x*x - 2 ); } double df( double x ) { return( 2 * x ); } void newton(void) { int count; double a,newa; count=0; printf( "初期値を入力してください。\n" ); scanf( "%lf", &a ); while( 1 ) { count++; newa= a - f( a ) / df( a ); if ( fabs( newa-a ) < EPS ) { printf("解の値は %f\n収束するのに %d 回かかりました。\n", newa, count); break; } a=newa; if ( count > MAX ) { printf( "収束しませんでした。\n" ); break; } } } int main(void) { while( 1 ) { newton(); printf( "Repeat? <y> or <n>\n" ); if ( getch() == 'n' ) break; } return ( 0 ); }
関連するQ&A
- C言語の質問です
ニュートン法のプログラムを組んだのですがPAD図が描けなくて困ってます どなたか回答お願いします /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double a; //グローバル変数 double f(double x) //fは関数f(x) { return x * x - a; //f(x)=x~2-a } double df(double x) //dfはf(x)の導関数f’(x) { return 2 * x; //df(x)/dx = 2x } double newton(double x, double (*f)(double), double (*df)(double), double eps) { int n = 0; //初期化 double x0, err; //x0は初期値 printf("# n, x, err\n"); printf("%4d, % .15e\n", n, x); do { n++; x0 = x; x = x0 - f(x0) / df(x0); //切片でy=0、x=x1 err = fabs(x-x0); printf("%4d, % .8e, % .15e\n", n, x, err); } while (err >= eps); return x; } /*メインルーチン*/ int main(void) { double x, eps = 1.0e-10; //収束条件 char s[128]; fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); while (a <= 0.0) { fprintf(stderr, "'a' には正の数を入れてください。\n"); fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); } x = (a + 1.0) / 2.0; x = newton(x, f, df, eps); //ニュートン法の実装 printf("\n# √(%e) = % .15e\n", a, x); return 0; }
- 締切済み
- C・C++・C#
- C言語 ニュートン法
何をすればいいかよくわからなくて躓きました わかる方どうかお願いします 問 以下に示すプログラムで、x1 = x0 - f (x0) / f '(x0)を用いて、方程式の左辺関数 f (x) (= x 2 - a ) およびその導関数 f '(x) を独立させろ。 入力変数 a はグローバル変数としてよい。 導関数 f '(x)はプログラム内ではdfと表記することとする。 また、適切なコメントも追加すること。 /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double newton(double x, double (*f)(double), double (*df)(double), double eps) { int n; double a = 0, x, x0, err, eps = 1.0e-10; printf("# n, x, err\n"); printf("%4d, % .15e\n", n, x); do { n++; x0 = x; x = (x0 + a/x0) / 2; err = fabs(x-x0); printf("%4d, % .8e, % .8e\n", n, x, err); } while (err > eps); return x; } int main(void) { double a = 0, x, x0, err, eps = 1.0e-10; char s[128]; fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); while (a <= 0.0) { fprintf(stderr, "'a' には正の数を入れてください。\n"); fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); } x = (a + 1.0) / 2.0; printf("\n# sqrt(%e) = % .15e\n", a, x); return 0; }
- 締切済み
- C・C++・C#
- C言語 二分法
初投稿です。 お恥ずかしながらパソコンが苦手で、Cゲッが難しくてできません。 今回二分法です。 途中まではやったのですができません。 演習 0~1の乱数を12個発生させ,これらの平均をxi,yi とする。(s,tは乱数) xi=1/12(x1i+x2i+....x12i) yi=1/12(y1i+y2i+....y12i) このようなを1000個作り,(xi,yi)で散布図 を作りなさい。またx,yのそれぞれの平均を求 めよ。 この演習で #include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1.0e-5 float f(double x); void nibuin(void); int main () { int count; double a,b,m; count=0; printf("範囲の左の値を入力してください。\n"); scanf("%lf",&a); printf("範囲の右の値を入力してください。\n"); scanf("%lf",&a); if(count==1000){ printf("収束しませんでした。\n"); exit(1); } } while(!(fabs(a-b)<eps)); printf("解の値は%f\n収束するのに%d回かかりました。"m,count); } float f(double x) { reurn x*sin(x)+log(x); } まではできたのですが、 scanf("%lf",&a);とif(count==1000){の間に入る命令が打てません。 よろしくお願いします。
- 締切済み
- 数学・算数
- C言語プログラム(二分法)について質問です。
C言語プログラム(二分法)について質問です。 以下作成したプログラムでは、aを入力すると, x=b - (log(a)) - (a+x)/2の解が求まります。(今回式は適当ですが。) 二分法で解を求めるというプログラムは作成できたのですが、 このプログラムで、aを1~10まで変化させたときのxの値というようなループをプログラムでしたうえで、 a*xの値がもっとも大い点を求めるためにはどのようなプログラムを組めば(これを改良すれば)いいのでしょうか? 具体的に行いたいことは、この二分法のプログラムをaとxの関数とし、a*xの最大点を求めたいのです。 質問が分かりにくいかもしれませんが、お願いします。 以下作成したプログラムです。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define eps 1.0e-6 double b=0.3; double a=0; double f(double x); void nibun(void); int main() { nibun(); return 0; } void nibun(void) { int count; double x0,x1,m; printf("aの値\n"); scanf("%lf",&a); count=0; x0=-2*b; x1=b; do { count++; m=(x0+x1)/2.0; if(f(m)*f(x0)<0) x1=m; else x0=m; if(count==700) { printf("Error\n"); exit(1); } } while (!(fabs(x0-x1)<eps)); printf("解の値は %f\n",m); } double f(double x) { return(b - (log(a)) - (a+x)/2); }
- ベストアンサー
- C・C++・C#
- すみません…。C言語の質問です!!
以下のような、ニューロン法のプログラムを作成したのですが、上手く結果を得ることが出来ませんでした…。どこが、どのように間違っているのかが分からないので、プログラムを修正していただけると嬉しいです。 よろしくお願いします。 1. #include <stdio.h> 2. #include <stdlib.h> 3. #include <math.h> 4. /*--- 関数 f( x ) = x - cos( x ) ---*/ 5. double f( double x ) 6. { 7. return x - cos(x) ; 8. } 9. double df( double x ) 10. { 11. return 1 + sin(x) ; 12. } 13. /*--- メイン関数 ---*/ 14. int main( void) 15. { 16. int cnt ; 17. double x_OLD, x_NEW, eps = 0.0001 ; 18. cnt = 0 ; 19. x_NEW = 1.5 ; 20. printf("計算回数 x f(x)\n") ; 21. printf("%d %lf %lf\n", cnt, x_NEW, f(x_NEW)) ; 22. do{ 23. cnt++; 24. x_NEW = x_OLD ; 25. x_NEW = x_OLD - ( f(x_OLD) / df(x_OLD) ) ; 26. printf("%d %lf %lf\n", cnt, x_NEW, f(x_NEW)) ; 27. }while( fabs(x_NEW - x_OLD) < eps ); 28. }
- 締切済み
- C・C++・C#
- このグラフが書きたいんですが。。
#include <stdio.h> #include <math.h> #define KMAX 20 void eval(float x,float *f,float *df) { float e; e= exp(-x); *f= x-e; *df= 1+e; return; } void main() { float x, eps, f, df, d; int k; scanf("%g%g", &x, &eps); printf("Solution of f(x)=x-eps(-x)=0\n"); printf("Convergence criterion |f(x)|<%G\n\n", eps); printf(" k\tx\t\tf(x)\t\tf'(x)\t\tcorrection\n"); for(k=0;k<KMAX;k++){ eval(x, &f, &df); d= -f/df; printf("%2d %15.6e %15.6e %15.6e %15.6e\n", k, x, f, df, d); x += d; if(fabs(f)<eps) break; } if(k>=KMAX) printf("divergent?\n"); printf("\nroot=%g\n", x); } この解における収束状況をグラフを書いて確かめたいのですがどうやって、何で書いたらいいのかわかりません。教えてください!このプログラムはC++で書いたNewton法です。
- 締切済み
- Windows系OS
- C言語
#include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }
- 締切済み
- その他(学問・教育)
- 大学のC言語の課題で
ルンゲクッタ法を用いたバネの単振動を解析する課題をやっています。以下の部分まで作ったのですが、 どうしても最後のほうがわかりません。 関数fとf2のreturn やメイン関数を変更すればいいとおもうのですが、どうやっても満足な結果が得られません。どなたか詳しい方教えてもらえない? #include<stdio.h> #include<math.h> double f(double t,double y1) { return y1; } double f2(double t2,double y2) { double w=5.0,k=0.5; return -w*w*f(t2,y2)-2.0*k*y2; } int main(void) { int count,bunkatu,npr; double t_0,T; double k1,k2,k3,k4; double y,t,dt,dt_2,dt_6; t_0 = 0.0; T=10.0; bunkatu=2000; npr=1000; y=1.0; printf("\n# [t_0,T]=[%6.4lf,%6.4lf] N=%d\n",t_0,T,bunkatu); t=t_0; dt=(T-t_0)/(double)bunkatu; dt_2=dt/2.0; dt_6=dt/6.0; for(count=0;count <=bunkatu;count++) { if(count %(bunkatu/npr)==0) printf("\n %5.2lf %10.5f",t,y); k1=f2(t,y); k2=f(t+dt_2,y+k1*dt_2); k3=f(t+dt_2,y+k2*dt_2); k4=f(t+dt,y+k3*dt); y+=(k1+2.0*k2+2.0*k3+k4)*dt_6; t+=dt; } printf("\n"); return 0; }
- 締切済み
- C・C++・C#
- はさみうち法のプログラム(C言語)について
調べたりしながら私なりに書いてみたのですが上手くいきません。 「ans=1.048404」とならなければいけないのに 「nan」で返ってきてしまうのです。 どこをどの様に変えたら良いのでしょうか・・・? ※課題の締め切りが近いので,早急にご回答宜しくお願い致します! 以下、はさみうちのプログラム↓ #include<stdio.h> #include<math.h> /*初期値x0,*/ /*f(x)を定義*/ double f(double x){ return sqrt(x*x+10.0) - 10.0*exp(-x*x); } /*はさみうち法の関数*/ double hasamiuchi(double x0,double x1,double eps,double imax){ double x2; /*x軸との交点*/ int i; /*繰り返しの回数*/ if(f(x0)*f(x1)>0){/*x0とx1が同符号の場合x1をx0とする*/ x0=x1; } for(i=0;i<imax;i++){ x2=(x1*f(x0)-x0*f(x1))/(f(x0)-f(x1)); /*x0とx1で出来る直線とx軸の交点x2を求める*/ x1=x2; /*x2の値を次のループにおけるx1とする*/ } if(fabs(x1-x0)<eps) return x2; /*収束したら解x2を返す*/ return 0.0/0.0; /*収束しなかったらnanを返す*/ } int main(void){ printf("ans = %f\n", hasamiuchi(2.0,1.0,1e-6,20));/*値を代入してはさみうちの実行*/ return 0; }
- ベストアンサー
- C・C++・C#