• 締切済み

newton法プログラミング

Schemeの言語でnewton法を作成プログラミングなんですが、なかなか出来ないのです。 答えがほしい。お願いします! 関数newtonへの引数tとして与えるとともに、最大の繰り返し回数nを引く数として指定し、収束しない場合でも再帰を停止するように変更しなさい。修正したnewtonをnewton2という名前としなさい。 ;; (define TOLERANCE 0.0001) ;; d/dx : (number->number) number number -> number ;; inclination of the tangent (define (d/dx f x h) (/ (- (f (+ xh)) (f (- x h))) (* 2h))) ;;find-root-tangent: (number -> number) number -> number ;;to find the root of the tangent of f at r0 (define (find-root-tangent f r0) (local ((define H 0.001)) (- r0 (/ (f r0) (d/dx f r0 H))))) ;;newton: (number->number) number->number ;;to find a number guess such that (<= (abs (f guess)) TOLERANCE) (define (newton f guess) (cond [(<= (abs(f guess)) TOLERANCE) guess] [else (newton f (find-root-tangent f guess))])) ;;for test (define (f2 x) (+ (*x x x)(* -6 x x) (* 11 x) -6)) (newton f2 0.5) ;;newton2 : (number->number) number number number -> number (define (newton2 f guess t n) (cond..................?????<----ここが問題です

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その「問題」のところで何をすべきか理解していますか?

関連するQ&A

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

    私はBorlandのコンパイラを使ってCプログラミングをやっているのですが、以下のプログラムが実行できません。 どのようにすればコンパイラできるのか教えてください。 非線型方程式f(x)=x^3-x+1の根をニュートン法により求めよ。 /* *-------------------------- *   ニュートン法 * *-------------------------- */ #include <stdio.h> #include <math.h> #define f(x) ((x)*(x)*(x)-(x)+1) #define g(x) (3*(x)*(x)-1) #define EPS 1e-8 #define LIMIT 50 int main(void) { double x=-2.0,dx;   int k; for (k=1;k<=LIMIT;k++){ dx=x; x=x-f(x)/g(x); if(fabs(x-dx)<fabs(dx)*EPS){ printf("iteration=%d\n",k); printf("x=%f\n",x); break; } } if (k>LIMIT) printf("収束しない\n"); } コンパイルしようとすると以下のようなエラーが出ます。 エラー E2206 sample.c 18: 不正な文字 ' ' (0x8140)(関数 main ) エラー E2206 sample.c 18: 不正な文字 ' ' (0x8140)(関数 main ) 警告 W8070 sample.c 32: 関数は値を返すべき(関数 main ) *** 2 errors in Compile *** お答えよろしくお願いします。

  • プログラミングで・・・

    以下のプログラムにおいて,N回 s=--- s=---  ・  ・  ・ と表示させるにはどうしたらよいでしょか. ----------------------------------------- /*台形公式*/ #include<stdio.h> #include<math.h> double f(double x); int main(void){ /*Define variablest*/ int i,N; double a,b; double dx,xi,s,err; /*Function*/ printf("f=sin(x)+1/2cos10x\n"); /*Integral Field*/ a=0; b=M_PI; printf("a=0\n"); printf("b=pai\n"); /*Inputs data*/ printf("N="); scanf("%d",&N); /*width of integral's range*/ dx=(b-a)/(double)N; s=f(a)*0.5; /*for Loop*/ s=0; for(i=1;i<=N; i++){ xi=a+dx*(double)i; s=s+f(xi); } s=s+f(b)*0.5; s=s*dx; printf("s=%6.3e err=%6.3e\n",s,err); return 0; } double f(double x){ return sin(x)+1/2*cos(10*x); }

  • 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; } コンパイルできません。 間違いとどうすればよいかを教えていただけるとありがたいです!!!

  • 定積分のプログラミングについて

    刻み幅dxを入力し、f(x)=4/(1+x^2)を0~1まで定積分するというプログラムを作ったんですが、なぜか、刻み幅を入力してENTERを押すと、 ずら~~~~~っと無限に結果の文字列が出てきてしまいます。 書いたプログラムを載せるので、間違っている箇所を教えてもらえませんか。お願いします。 #include <stdio.h> #include <math.h> double f(double m); main(){ double x,F,dx; printf("Numerical integration of y=4/(1+x^2).\n"); /*刻み幅の入力*/ scanf("%lf,&dx:"); /*aとbと刻み幅*/ printf("The lowwer bound:0.0\n"); printf("The upper bound:1.0\n"); printf("The meth width:dx\n"); /*関数*/ for(x=0.0;x<1.0;x+=dx) { F=f(x); /*計算結果を出力*/ printf(" f(%lf)= 4/(1+x^2) =%lf\n",x,F); } } double f(double m) { double y; y=4/(1+m*m); return y; }

  • 関数の問題です(少し英語含みます)

    いつも大変お世話になっております。 関数の問題なんですが、 どのように英語を解釈し、解答すればいいのかよく分かりません。 お手数ですがご教授頂ければ幸いです。 -問題- この式を使って以下の問いに答えよ。 f(x)=2x^2-3x+5 1:導関数/微分関数の定義を使用し、f ' (x)を求めよ。(Find using the definition of derivative.) 2: x=2での接線の傾斜f ' (2)を求めよ。(Find f ' (2), the slope of the tangent line at x=2.) 3: x=2での接線の式を求めよ。(Find f ' (2), the equation of the tangent line at x=2.) どうぞよろしくお願い致します。

  • 広義積分の存在を示す。

    hを(-2,2)上で定義されたC^1-級関数とする。h(0)=0であれば、広義積分∫[0→1]h(x)/{x^(3/2)}dxが存在することを示せ。 という問題で、自分なりに考えてはみたのですが、全く自信ありません。すみませんが、正しい解法を教えてください。ちなみに自分の解答は以下のようになりました。 h(x)を原点まわりにテイラー展開すると、 h(x)=h(0)+h'(0)x+R[2]=h'(0)x+R[2]となる。 ここで、R[2]={{f(c)}^(2)}x/(n+1)!である。(0<c<x) これを∫[0→1]h(x)/{x^(3/2)}dxに代入すると、 ∫[0→1]{h'(0)x+R[2]}/{x^(3/2)}dx =∫[0→1]h'(0)*x^(-1/2)dx+{{f(c)}^(2)}/(n+1)!*∫[0→1]x^(-1/2)dx =h(0)+2h'(0)+2{{f(c)}^(2)}/(n+1)! =2h'(0)+2{{f(c)}^(2)}/(n+1)! (0<c<x) となるので、これが∫[0→1]h(x)/{x^(3/2)}dxの値となり、この広義積分は存在することが分かる。(証明終)

  • プログラミング(c言語)

    以下のプログラムでオイラー法を用いた2階微分方程式を解きたいのですが、xとvyの値が変化しません。どこが間違っているのか教えて欲しいです 写真は問題文です #define _USE_MATH_DEFINES #include<stdio.h> #include<math.h> int main(){ int i; double x,x0,y,y0,vx,vx0,vy,vy0,r,dt,t=0.0; double G=6.674/pow(10.0,11.0),M=1.988*pow(10.0,30.0); x0=1.496*pow(10.0,11.0),y0=0.0,vx0=0.0,vy0=2.978*pow(10.0,4.0); dt=M_PI/100; for(i=1;i<=2000;i++){ x=x0+dt*vx0; y=y0+dt*vy0; r=sqrt(x0*x0+y0*y0); vx=vx0-dt*(G*M*x0/(r*r*r));vy=vy0-dt*(G*M*y0/(r*r*r)); t=dt*i; printf("x(%f)=%e y(%f)=%e vx(%f)=%e vy(%f)=%e\n",t,x,t,y,t,vx,t,vy); x0=x; y0=y; vx0=vx; vy0=vy; } return(0); }

  • Schemeのプログラミング うるう年関連

    Schemeのプログラミング うるう年関連 Schemeで、 「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」 という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日) どうもエラーが出て実行できません。 自分は以下のように組みました。 ;;(1)の関数 (define (leap? year) (cond [(= (remainder year 400) 0) #t] [(and (= (remainder year 4) 0)(> (remainder year 100) 0)) #t] [else #f] ) ) ;;(2)の関数 (define (num-of-days year month) (cond [(and (= month 2)(= (leap? year) #t)) 29] [(and (= month 2)(= (leap? year) #f)) 28] [(or (= month 1)(= month 3)(= month 5) (= month 7)(= month 8)(= month 10) (= month 12)) 31] [else 30] ) ) これを例えば (num-of-days 2008 4) や (num-of-days 1995 12) などとして実行すると、それぞれ30,31という正しい値を返してくれるのですが、 (num-of-days 2008 2) や (num-of-days 1995 2) など、閏年・非閏年に関係無く、2月が絡むと =: expects type <number> as 1st argument, given: false; other arguments were: true というエラーを吐いてしまいます。 何度も見直しましたが、どこが間違っているのか見付けきれません…。どなたか間違いを指摘して頂けると幸いです。

  • 二分法のプログラム

    関数x^3-7x^2-6x+2を二分法で解くプログラムを作ったのですが、エラーが出てコンパイルできません。訂正箇所を教えて下さい。 宜しくお願い致します。 #include<stdio.h> #include<math.h> #define EPSILON 0.1E-5 #define TURE 1 #define FALSE 0 int kansu(int x); void Nibunho(left,right,sol,flag); double left,right; int flag; int main(void) { printf("区間の左端と右端は?\n"); scanf("%lf %lf",&left,&right); flag=FALSE; Nibunho(left,right,&root,&flag); if(flag) printf("解 = %e (繰り返し回数 = %d)\n",root,k); else { printf("入力した範囲で解は求まりませんでした。\n"); printf("f(%e) = %e \n",root,k); } return 0; } int kansu(int x) { int f(double x) f(x)=x*x*x-7.0*x*x-6.0*x+2.0; return(f(x)); } void Nibunho(left,right,sol,flag) { double left,right,*sol; int *flag; double a,b,c,fa,fb,fc; k=0; a=left; b=right; do { k++; c=(a+b)/2.0; fc=f(c); fa=f(a); fb=f(b); if(fabs(fc)<1.0e-10) { a=c; b=c; *flag=TRUE; } else { if( (fa * fc < 0.0) || (fb * fc < 0.0) ) { *flag = TRUE; if( (fa*fc) < 0.0 ) b=c; else a=c; } else { if( fabs(fa) > fabs(fb) ) a=c; else b=c; } } } while((b-a)>EPSILON) *sol=(a+b)/2.0; }

  • 積分のやり方を教えてください

    f(x)=g(h(x)) ∫f(x)dx=F(x)+C1 ∫g(x)dx=G(x)+C2 ∫h(x)dx=H(x)+C3 が成立するとき、これを積分するには、どの式が正解ですか? ∫f(x)dx=∫g(h(x))dx=G(h(x))+C ∫f(x)dx=∫g(h(x))dx=g(H(x))+C ∫f(x)dx=∫g(h(x))dx=G(H(x))+C

専門家に質問してみよう