質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

737閲覧

C言語による二分法計算

kuronomonemone

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/02 12:25

前提・実現したいこと

C言語を用いて、以下のような二分法の計算を行いたいのですがwhileの計算部分が無限に繰り返されてしまい困っているのでどう直せばよいかを教えてください。

  1. arg1、arg2の初期値を0、π-atan(argf * C *R)とする。
  2. arg1、arg2の中点をmとする。
  3. 解が[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); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ループ内でkを宣言してしまっているため、ループ外で宣言したkの値が更新されていません。
また、abs()int用です。doubleならfabs()を使用してください。

diff

1- double k=abs(z); 2+ k=fabs(z);

投稿2021/05/02 12:47

編集2021/05/02 13:28
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuronomonemone

2021/05/02 12:49

ご回答ありがとうございます。 kを絶対値でとりたいのですがどうすればよいのでしょうか?
kuronomonemone

2021/05/02 13:04

ループ内でkを宣言せずにどこですればよいのでしょうか、何度もすみません。
episteme

2021/05/02 13:06

whileの直前で(すでに)宣言してますよ?
kuronomonemone

2021/05/02 13:10

kの値はwhile内でarg1,2が更新されていくことで随時変わっていくため、ループの直前では仮に1とおいてループ内で更新されるようにやったつもりだったのですが、不備があったでしょうか。 無知ですみません。
episteme

2021/05/02 13:11

回答のとおり、「ループ内でkを宣言してしまっているため、値が更新されていません。」
kuronomonemone

2021/05/02 13:14

更新されるためにはどうすればよいのでしょうか
episteme

2021/05/02 13:16

回答のとおり、「 k=fabs(z);」
kuronomonemone

2021/05/02 13:17

それはどこで宣言すればよいのでしょうか。 本当に何度もすみません。
SHOMI

2021/05/02 13:25

double k=1; while(k>0.001){ (略) k=fabs(z); } ですって。
kuronomonemone

2021/05/02 13:26

ありがとうございます。何度もすみませんだした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問