• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語)

C言語で写真の課題を解くプログラムが上手くいかない

このQ&Aのポイント
  • C言語で写真の課題を出されたが、自分のプログラムでは上手くいかない。どこが間違っているのか教えて欲しい。
  • C言語で写真の課題を出されたが、自作のプログラムが上手く動作しない。どこに問題があるのか教えてほしい。
  • C言語で写真の課題に取り組んでいるが、プログラムが正しく動作しない。どうすれば解決できるか教えてほしい。

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8467/18126)
回答No.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で関数値が異符号になっています。

mothiduki
質問者

お礼

助かりました。ありがとうございます。

その他の回答 (4)

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.4

試しに書いてみた。 #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)
回答No.3

そのそも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を変化させてください。

mothiduki
質問者

補足

2分法の問題文を見落としてました。 そこで2分法について調べながらやってみたのですが(x,y)=(0,0)の時のzをZと(x,y)=(cosθ,sinθ)の時のzをzとした時、座標の平均を代入したzをaとした時にどの条件の時にaをZに入れるのか、またはaをzに入れるのかがわからないです。 わかりにくくてすみません😰

回答No.2

>ルートの中のxをーxにしてるのは代入するxの値がマイナスだからです。 あ~理解しました。失礼 abs(x)をしたかったのですね。 こちらの理解不足でした!

回答No.1

ざっと見で、何がしたいのかは、把握せずの回答になります。 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);

mothiduki
質問者

補足

ルートの中のxをーxにしてるのは代入するxの値がマイナスだからです。

関連するQ&A