添削見直しをお願いします

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
moritomoni

添削見直しをお願いします

#1

投稿記事 by moritomoni » 2年前

初めての質問であり至らぬところがあると思いますがよろしくお願いします。
C言語を用いて、以下のような二分法の計算を行いたいのですがうまくいかず困っているのでどう直せばよいかを教えてください。


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を解とする

コード:

#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;
    double g=(pow(e,-(PI+arg1-m)/f))* sin(m)-sin(arg1);
    double gm =(pow(e, -(PI+m-arg2)/ f))*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("θ1 %lf (rad) \n",arg1);
    printf("θ2 %lf (rad)\n", arg2);
}

box
記事: 2002
登録日時: 13年前

Re: 添削見直しをお願いします

#2

投稿記事 by box » 2年前

うまくいかず困っている
これだけだと、何もわかりません。こちらには質問者さんのパソコンは見えませんので。
というわけで、
何をしたとき(ビルド?実行?その他?)に
どううまくいかない(エラーが出る?どんなエラー?メッセージは?
結果が全く出ない?結果は出るけど想定外?)のか
を具体的に示してください。じゃないと、回答できないんですよね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

moritomoni

Re: 添削見直しをお願いします

#3

投稿記事 by moritomoni » 2年前

ご指摘ありがとうございます。
このプログラムを実行したところ、同じ計算を何度もし続けてしまいpcが固まってしてしまいます。
box さんが書きました:
2年前
うまくいかず困っている
これだけだと、何もわかりません。こちらには質問者さんのパソコンは見えませんので。
というわけで、
何をしたとき(ビルド?実行?その他?)に
どううまくいかない(エラーが出る?どんなエラー?メッセージは?
結果が全く出ない?結果は出るけど想定外?)のか
を具体的に示してください。じゃないと、回答できないんですよね。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 添削見直しをお願いします

#4

投稿記事 by あたっしゅ » 2年前

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21150&sid=cfe85752ca3b260584f80a0f563f4c04
// 添削見直しをお願いします - ミクプラ(ja)
//
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define PI 3.141592653589
#define e 2.71828182846


//double
int
main(void) {
    double C = 0.00068;
    double argf = 2 * PI * 50;
    double R;
    printf("抵抗値R ");
    scanf_s("%lf", &R, 256 );

    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;
        double g = (pow(e, -(PI + arg1 - m) / f)) * sin(m) - sin(arg1);
        double gm = (pow(e, -(PI + m - arg2) / f)) * sin(arg2) - sin(m);
        double gg = g * gm;

    
        if (gg > 0) {
            arg1 = m;
        }
        else {
            arg2 = m;
        }
        printf("θ%lf (rad)  %lf (rad)\n", arg1, arg2);

        double z = arg1 - arg2;

        //double k = abs(z);
        k = fabs(z);
    }

    printf("θ1 %lf (rad)\n", arg1);
    printf("θ2 %lf (rad)\n", arg2);

    return EXIT_SUCCESS;
}


// end.
東上☆海美☆「
//double k = abs(z);
k = fabs(z);
元のプログラムだと、while() 内で k が再定義されているため、while() の条件式の中の k が更新されないみみ。
あと、abs() は、整数系専用みみ。浮動小数には fabs() みみ。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

“C言語何でも質問掲示板” へ戻る