- ベストアンサー
C言語で写真の課題を解くプログラムが上手くいかない
- C言語で写真の課題を出されたが、自分のプログラムでは上手くいかない。どこが間違っているのか教えて欲しい。
- C言語で写真の課題を出されたが、自作のプログラムが上手く動作しない。どこに問題があるのか教えてほしい。
- C言語で写真の課題に取り組んでいるが、プログラムが正しく動作しない。どうすれば解決できるか教えてほしい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
二分法の原理は以下の通り。 f(a)とf(b)が異符号となっているところから始める。 aとbの中点sを考えて f(a)とf(s)が異符号なら、bをsに置き換えて次回はaとsで評価する。 f(a)とf(s)が同符号なら、aをsに置き換えて次回はsとbで評価する。 #4に具体的なプログラムを書きましたので参考にしてください。 原点O(0,0)と点P(x,y)=(rcosΦ,rsinΦ)とするとき x、yの2変数だと二分法を考えるのがむつかしくなるので、Φを固定して考えます。これでr=0とr=10で関数値が異符号になっています。
その他の回答 (4)
- f272
- ベストアンサー率46% (8467/18126)
試しに書いてみた。 #include<stdio.h> #include<math.h> double f(double r, double phi) { double x, y; x=r*cos(phi); y=r*sin(phi); return 1.0-x*x-(sqrt(fabs(x))+y)*(sqrt(fabs(x))+y); } void bisection(double a, double b, double p, double eps, double *sol, int *N) { int i = 0; double s; while (!(fabs(a-b)<eps)){ i++; s = (a+b)*0.5; if(f(s,p) * f(a,p)<0) b=s; else a = s; if(i==1000) break; }; *N = i; *sol = s; } int main(){ int N, i; double phi, x,y,z, a=0.0,b=10.0,eps=1.0e-5,sol; for(i=0;i<=360;i++){ phi=i*M_PI/180; bisection(a, b, phi, eps, &sol, &N); x=sol*cos(phi); y=sol*sin(phi); z=f(sol,phi); printf("%f %f %f %d\n",x,y,z,N); } return(0); }
- f272
- ベストアンサー率46% (8467/18126)
そのそも2分法のプログラムと言われているのに,そうなっていません。 それはさておき,現状のプログラムがうまくいかないのは例えばi=90やi=270のとき c=10*cos(i*M_PI/180)は非常に小さい数になります。 そうすると y =x*d/cは非常に大きな数値になります。たとえxを0.001刻みで変化させても最初の0.001からy=16331778728383.843750のような数値になって話になりません。 xを0.001刻みで変化させるのではなく,rを変化させてください。
補足
2分法の問題文を見落としてました。 そこで2分法について調べながらやってみたのですが(x,y)=(0,0)の時のzをZと(x,y)=(cosθ,sinθ)の時のzをzとした時、座標の平均を代入したzをaとした時にどの条件の時にaをZに入れるのか、またはaをzに入れるのかがわからないです。 わかりにくくてすみません😰
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>ルートの中のxをーxにしてるのは代入するxの値がマイナスだからです。 あ~理解しました。失礼 abs(x)をしたかったのですね。 こちらの理解不足でした!
- AsarKingChang
- ベストアンサー率46% (3467/7474)
ざっと見で、何がしたいのかは、把握せずの回答になります。 https://www.ibm.com/docs/ja/i/7.1?topic=ssw_ibm_i_71/rtref/sqrt.html sqrt() 関数は、x の平方根の負以外の値を計算します。 戻り値 sqrt() 関数は、平方根の結果を戻します。 x が負の場合、関数は errno を EDOM に設定し、0 を戻します。 平方根なので、2乗して「マイナス」になる数はないと思いますよ。 z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y);
補足
ルートの中のxをーxにしてるのは代入するxの値がマイナスだからです。
お礼
助かりました。ありがとうございます。