• 締切済み

このグラフが書きたいんですが。。

#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法です。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

プログラムから、値を吐きだして エクセルでグラフにするか GNU Plotみたいなソフトを使うといいのでは

関連するQ&A

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

    #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つを表示させるためにランダムサーチのプログラムを上記のように書いたつもりなんですがうまく作動しません。どこをどう直したらいいのでしょうか、教えてください。

  • ランダムサーチ!!

    #include <stdio.h> #include <math.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)/2; 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つを表示するプログラムです。この方法をランダムサーチのプログラムと比較したいのですが、プログラムがうまく書けず悩んでいます。よろしければどちらがどのようなメリット、あるいはデメリットがあるのかも教えてほしいです。お願いします。

  • sinのプログラム

    #include<stdio.h> #include<math.h> #define NMAX 100 main(){ float eps,x,t,s; int n; printf("Taylor series\n"); scanf("%g",&eps); printf("eps=%g\n",&x); for(;scanf("%g",&x)!=EOF;){ printf("\nx=%g\n n\tt\t\ts\n",x); t=s=1; for(n=1;n<NMAX;n++){ t*=X/n; s+=t; printf("%2d %15.6e %15.6e\n",n,t,s); if(fabs(t)<eps) break; } if(n>=NMAX) printf("---not converged ---\n); printf("exp(%g)=%g\tn=%d\n",x,s,n); } return(0); } これはeの級数展開をもとめるプログラムなのでが、これをsinの級数展開のプログラムに改造しろという問題があります。 sinのn乗の項を求めてeの部分と置き換えてやってみたのですができません。 どなたかわかる方がいましたら、教えてください。

  • どこがおかしいのでしょうか??

    下のプログラムはsinの級数展開を求めるプログラム…を書いたつもりなんですが計算機と違う値がでてしまい困っています。どこをどう直せばいいのか教えてもらえませんでしょうか??それともこのプログラムではうまくいかないのでしょうか?返答をお願いします。 #include <stdio.h> #include<math.h> #define NMAX 100 main() { float eps,x,t,s; int n; printf("Taylor series\n"); scanf("%g", &eps); printf("eps=%g\n", eps); for(;scanf("%g", &x)!=EOF;){ printf("\nx=%g\n n\tt\t\ts\n", x); t=s=x; for(n=1;n<NMAX;n++){ t*=-x*x/((2*n+1)*(2*n)); s+=t; printf("%2d %15.6e %15.6e\n", n, t, s); if(fabs(t)<eps) break; } if(n>=NMAX) printf("--- not converged ---\n"); printf("exp(%g)=%g\tn=%d\n", x, s, n); } return(0); }

  • BCC Devaloper のエラーについて

    C言語の初心者で、BCC Developerで自習しているのですが 参考書に書いてあるプログラミングを打ってもエラーが出てその原因が分かりません 本文は /* 3-10 */ #include<math.h> float EPS=1e-8 float s,d,e,x=60*3.14159/180; int k, flag=0; s=1.0;e=1.0; for(k=1;k<=200;k=k+2){ d=s; e=-e*x*x/(k=k+2){ s=s+e; if(fabs(s-d)<=EPS*fabs(d)){ flag=1; break; } } if(flag==1) printf("%f\n",s); else printf("収束しない\n"); } というもので、コサインのテイラー展開が収縮するかを見極めるものです エラー内容は Error 3-10.rc 4 10: Expecting filename or BEGIN ** error 20018 ** deleting Debug\3-10.res Build End !! (Elapsed time 0:00.791) です  よろしくお願いします

  • 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; }

  • プログラム エラー BCC Developer

     BCC DeveloperでC言語のプログラミングの勉強をしようとしているのですが、エラーの原因が分かりません  初心者で、この文に関しても本の丸写しなのですが(”河西メソッド C言語プログラミング学習の方程式”という本です)  エラー内容は Error 3-10.rc 4 10: Expecting filename or BEGIN ** error 20018 ** deleting Debug\\3-10.res Make End !! (Elapsed time 0:00.120) というものです 本文は /* 3-10 */ #include<math.h> float EPS=1e-8 float s,d,e,x=60*3.14159/180; int k, flag=0; s=1.0;e=1.0; for(k=1;k<=200;k=k+2){ d=s; e=-e*x*x/(k=k+2){ s=s+e; if(fabs(s-d)<=EPS*fabs(d)){ flag=1; break; } } if(flag==1) printf(\"%f\\n\",s); else printf(\"収束しない\\n\"); } です cos(X)のテーラー展開に関するものです この原因をご指摘いただければ幸いです

  • 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言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • Linuxプログラミングについて

     今回初めてLinuxでプログラム作成をしているのですが、どうもわからない 現象がでてしまい困っています。なにが悪いのかわかりません。  めちゃ困っています。助けて下さい。宜しくお願い致します。 (サンプルプログラム) #include <stdio.h> main(){ float float_data ; float float_data1 ; float float_data2 ; float RuisekiSum ; printf("\n") ; float_data = 0.1 ; float_data1 = 1.1 ; float_data2 = 0.01 ; RuisekiSum = float_data1 * float_data2 ; printf(" data → float1( %f. %e )\n" , float_data1,float_data1 ) ; printf(" float2( %f, %e )\n" , float_data2,float_data2 ) ; printf(" RuisekiSum = float_data1 * float_data2\n" ) ; printf(" = 0x%x( %f , %e )\n" , RuisekiSum, RuisekiSum, RuisekiSum ) ; printf("\n") ; exit(0) ; } (実行結果) data → float1( 1.100000. 1.100000e+00 ) float2( 0.010000, 1.000000e-02 ) RuisekiSum = float_data1 * float_data2 = 0x0( 0.000000 , 5.265658e-315 ) 何が悪いのでしょうか? 恥ずかしいながら宜しくお願い致します。