• 締切済み

c言語の二分法、はさみうち法、NR法のプログラミングについて

1/x=tanxの数値解を終了条件が|1/x-tanx|<1×10の-11乗で二分法、はさみうち法、NR法で解かなければならないのですが、プログラミングの知識がほとんどないためわかりません。学校でif文、 for文、 if else文を習った程度ですので、その範囲で教えてくださる方がいらっしゃいましたらよろしくお願いします。

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>反復法で作ってみたのですが、breakがうまく作動しませんでした。 そのソースを見せてください。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

それぞれの方法の考え方は理解されているのですね?

iroihs
質問者

補足

少し危ういです。 反復法で作ってみたのですが、breakがうまく作動しませんでした。

関連するQ&A

  • はさみうち法のプログラム(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言語の二分法のプログラムについて

    二分法によりルート2の近似値を求めるプログラム、ってどうやって作ったらいいんですか? ちなみに初期値は2で、収束条件は10^-5です。 収束までの回数も求めなきゃいけません(ニュートン法と比較するため。ちなみにニュートン法はできました。) 似たような質問を見つけたのですが、どれも、難しいプログラムばかりで解読ができません。 関数とかif else文とかwhile文とかfor文とか、そういう簡単なのしか習ってないので、それで作れる範囲で教えてくださる方、 いらっしゃいましたら、よろしくお願いします。

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

    解を判定するプログラミングを作成したのですが、a,b,cを0,1,2と入力したときに解に0.00000が出てきて解がおかしくなります。 どなたか詳しい方教えてください。また簡潔にできる点などありましたらご指摘お願いします。 #include <stdio.h> #include <math.h> int main (void) { double a,b,c,d,x1,x2; printf("ax^2+bx+c=0 の係数を入力してください\n"); scanf("%lf %lf %lf",&a,&b,&c ); if(a==0){ if(b==0) { printf("解は存在しません\n"); } else { x1=-c/b; printf("解は %f です\n",x1); } } else { d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2.0*a); x2=(-b-sqrt(d))/(2.0*a); if(d==0){ printf("解は %f (重解)です\n",x1); } else { printf("解は %f と %f です\n",x1,x2); } } else { printf("実数解は存在しません(虚数解)\n"); } } return 0; }

  • C++で二分法のプログラム

    C++で二分法のプログラムを作るんですが x1-x2が十分小さくなれば(10^-5)終了する 例 cos(x/2)の解を出す これどうやればいいんですか?whileを使うらしいですが。 文法というのは、 if系、while、switch、continue、for、break文くらいしかやってないんですが #include <iostream> #include <cmath> using namespace std; int main() { までは行きますが… 出力はcout 入力はcinでお願いできないでしょうか

  • C言語のプログラミング教えて!!

    C言語で次の二つの微分方程式 y'=yの解をx=0~1の範囲 y'=-4yの解をx=0~4の範囲 を、Heun法、Runge-Kutta法により求めるプログラムを作りたい。 初期条件はx=0,y=1で、また、間隔Δxを変えたときの解の変化も調べたい。全くわからずお手上げ状態です。 分かる方がいましたら、回答よろしくお願いします。

  • 割線法とはさみうち法の収束性について

    割線法とはさみうち法の収束性について 球根アルゴリズムに割線法とはさみうち法がありますね。 これら二つのアルゴリズムについて質問です。 まず割線法は必ず根に収束するとは限りません。 割線法が根に収束する(またはしない)条件の導出法を教えてください。 次にはさみうち法ですが、はさみうち法にはいくつか亜種があると思います。 まず一つが、初期値a,bによってはさまれたcを求め、bをcに更新してループを回すやり方です。 このやり方ではaは固定されたままです。if f(a)・f(c)<0 then b=c else a=c という条件分岐はやりません。 この場合、収束性はどうなるでしょうか。 二つ目は、上記の条件分岐をやるやり方です。 このやり方は必ず収束するらしいのですがその証明を教えてください。 よろしくおねがいします。

  • C言語プログラミング

    プログラミングについてです。 osはLinuxです。 x+logx=0の解を求めるプログラムを作れで ニュートン法を使ってみましたがあってますか? #include <stdio.h> #include <math.h> #define EPS 1e-8 main( ) { double a, old_x, new_x; int i; printf(" a="); scanf("%lf", &a); new_x = a; for(i=1; i<=100; i++) { old_x=new_x; new_x = old_x*(1-log(old_x))/(old_x+1); printf("x%d = %f\n", i,new_x); if(fabs(old_x*(1-log(old_x))/(old_x+1)) < EPS) break; } } いろいろな数字で実行してみた結果 nanと 0.567143の二つに分かれました。 どこか間違いがあるのですか

  • 二分法のサブ化する方法について

    こんばんは。C言語は超初心者です。以下の文は二分法の部分をサブ化したつもりの文です。がうまくいきません。修正箇所が山ほどあると思いますがよろしくお願いします。 int main (void) { double solution, x; double bisec(double x); solution=bisec(x); cout<<solution<<endl; return 0; } //bisec sub double bisec(double x) { double x, x0, x1, x2, y, y0, y1; int i=0, k=0, j=0; x=0.1; y1=f(x); for(;;) { for(;;) { x+=0.1; if(x>=10.0) { exit(0); } y=f(x); if(y*y1>0) { y1=y; } else { x1=x-0.1; x2=x; x0=x; y0=y; break; } } for(;;) { x=(x1+x2)/2.0; i++; if(fabs((x-x1)/x)>1.0e-14) { y=f(x); if(y*y1>0) { x1=x; y1=y; } else { x2=x; } } else { return x; x=x0; y1=y0; break; } } } } includeと関数f(x)の定義は省略しました。二分法のサブの部分は複数の解を得ることが出来るようになっています。次のことをご教授お願いします。 一つ目は、上の文のbisec(double x)をdouble()にするとエラーが出ないのですが根本的にその理由が分かりません。 二つ目は、解を複数表示する方法が分かりません。上の文では一回returnしちるため1つしか表示されないということは分かるのですが。。 なるべく原文を崩さないで修正お願いします。あまり変わってしまうと理解できないので。。お願いします。

  • 数値解析のはさみうち法について

    はさみうち法を使い数値計算をするプログラムで、解の近似値を求める式についてなんですが、 2点a,bを結んでx軸との交点をxにした時、  x=(a * f(b) - b * f(a)) / (f(b) - f(a));と  x=a-(b-a)/(f(b)-f(a))*f(a); の2通りの式で実行してみると、両方同じ近似値を求めることが出来たのですが、どちらの式も本当に正しい式なのでしょうか? よろしくお願いします。             

  • C言語 座標軸の設定

    こんにちわ。私は最近プログラミングを学び始めた女学生です。 環境はVisual Studio 2008で、C++を使っています。 今回、課題として座標軸を-と|でつくり、その上にxの3乗-9xのグラフをあらわすというものが出ました。 おおよそわかったのですが、なぜかx軸を形成する軸(-)がこのプログラムだとひとつおきに表示されてしまい、軸として成立しません。なぜなのでしょうか。熟練者の方々、ご指導ご鞭撻のほど、よろしくお願いいたします。 #include<stdio.h> main(void){ int a[40][60],x,y; for(x=0;x<40;x++){ for(y=0;y<60;y++){ a[x][y]=0; if (x==20){ printf ("-");} else if (y==30) { printf ("|"); } if(y==(x-20)*(x-20)*(x-20)-9*(x-20)+30){ printf("*"); } else {printf(" "); } } printf("\n"); } }

専門家に質問してみよう