前提・実現したいこと
C言語を用いて、以下のような二分法の計算を行いたいのですがwhileの計算部分が無限に繰り返されてしまい困っているのでどう直せばよいかを教えてください。
- arg1、arg2の初期値を0、π-atan(argf * C *R)とする。
- arg1、arg2の中点をmとする。
- 解が[arg1, m]と[m, arg2]のどちらの区間に存在するかを判定する。そのために、g(arg1) * g (m)の符号を見る。
4. g(arg1) * g (m) > 0 の場合解は[m, arg2]に存在し、
g(arg1) * g (m) < 0 の場合は[arg1, m]に存在する。
5. [m, arg2]に存在する場合arg1にmを代入し、
[arg1, m]に存在する場合arg2にmを代入する。
6. これにより、解の存在範囲が狭められたこととなる。狭まったかどうかは、区間の幅|arg1 - arg2|が微少幅δより小さくなったかどうかで判断する。ここでは、δ = 0.001とする。
7. |arg1 - arg2| > δ ならば、2~6の処理を再度行う、
|arg1 - arg2| < δ ならば、このときのmを解とする
発生している問題・エラーメッセージ
whileの計算部分が無限に繰り返されてしまう
該当のソースコード
#include <math.h> #include <stdio.h> #include <stdlib.h> #define PI 3.141592653589 #define e 2.71828182846 double main(void){ double C = 0.00068; double argf = 2*PI*50; double R; printf("抵抗値R "); scanf("%lf", &R); double f = argf*C*R; double f1 = f*180/PI; double x = atan(f1); double arg2 = PI - x; double arg1=0; double k=1; while(k>0.001){ double m=(arg2+arg1)/2.0; double g1=pow(e,-(PI+arg1-m)/f); double g=(g1* sin(m)-sin(arg1)); double gm1=(pow(e, -(PI+m-arg2)/ f)); double gm =gm1*sin(arg2)-sin(m); double gg=g*gm; if(gg>0){ arg1=m; }else{ arg2=m; } double z=arg1-arg2; double k=abs(z); } printf("k %lf\n",k); printf("θ1 %lf (rad) \n",arg1); printf("θ2 %lf (rad)\n", arg2); }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/02 12:49
2021/05/02 13:04
2021/05/02 13:06
2021/05/02 13:10
2021/05/02 13:11
2021/05/02 13:14
2021/05/02 13:16
2021/05/02 13:17
2021/05/02 13:25
2021/05/02 13:26