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

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

ただいまの
回答率

91.04%

  • C

    2961questions

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

ルンゲクッタ法でRC回路の出力関数を離散的にファイルに出力したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 118

微分方程式を解くアルゴリズムである
ルンゲクッタ法の課題が出されました。
入力が周期1秒,最大値Eの矩形パルスということで
0.5秒周期でe(初期値10)を0⇒10⇒0⇒10⇒1とクロックさせたいのですが
ファイルに出力してみるとずっと10のままで,0にクロックしていません・・・

何処が原因か教えていただきたいです;;

ほかにも問題があればご指摘していただきたいです><

イメージ説明

include <stdio.h>

include <stdlib.h>

include <math.h>

double clock(double E){
if(E==10) return 0;
else return 10;
}

double dxdt(double x,int E){
double c = 0.001;
double r = 50000;
return (E-x)/(r*c);
}

// ルンゲクッタ法(初期条件x0,  区間[t0, tn])
double runge(double x0, double t0, double tn, int n)
{

FILE *output; FILE *output1;FILE *output2;
output=fopen("output.txt","w");
output1=fopen("output1.txt","w");
output2=fopen("output2.txt","w");
double i;
double x, t, h, d1, d2, d3, d4,cnt,e;
x = x0;
t = t0;
e = 10;
cnt=0;
h = 0.01;
// 漸化式を計算

for ( i=1; i <= n ; i++){
if(cnt==0.500000){e=clock(e); cnt=0;}
t = t0 + i*h;
d1 = dxdt(x,e);
d2 = dxdt(x + d1*h*0.5,e);
d3 = dxdt(x + d2*h*0.5,e);
d4 = dxdt(x + d3*h,e);
cnt= cnt + h;
x += (d1 + 2 * d2 + 2 * d3 + d4)*(h/6.0); 
fprintf(output,"%f\n",t);
fprintf(output1,"%f\n",x);
fprintf(output2,"%f\n",e);
}

return x;
}

int main(void)
{
runge(0, 0, 1000, 50000);
return 0;
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

計算機の浮動小数点数は内部が二進数表現になっており、またdoubleですと通常仮数が53bit程度ということで当然ながら無限の精度はありません。よって二進数で循環小数になるような数値は正確に表せない(常に誤差を含む)という点を知っておく必要があります。

本件でいえば0.01は循環小数になるので0.01 * 50は0.5に正確には一致しないと考えるべきです。一般に==で等値判定するなら整数を用いるべきです。0.01を50回加算したら0.5になると考えるのではなく1を50回加算して50かどうか判定するように頭を切り替えないといけないんですね。

本件は計算機プログラミングで「数学の世界と矛盾するためにわかっていないと大変混乱する」代表的な例の一つですが、他にもありますよね・・・

int i = 2147483647;
while (i > 0) {
  i++;
}
// なぜか無限ループにならない・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C言語でテキストファイルの行削除

    C言語でテキストファイルの指定した行の削除を行いたいです。 sample.txtが >giaaaaaaaa hoge fuga piyo となっているときに、>giの行を削除し

  • 解決済

    Scene BuilderでCSSファイルと画像ファイルを読み込んだが、NetBeans上で反映され...

    Scene BuilderでCSSファイル読み込んで、ボタンが平面的になるボタンを作成し、 画像をファイルから読み込んで挿入し、Scene Builderでプレビューすると↓のよ

  • 解決済

    tableview row(cell)

    コード import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableView

  • 解決済

    Monacaでtimepickerの実装

    前提・実現したいこと MonacaでiOS/Andriod両方に対応しているアプリケーションを開発していて、アラーム機能を実装しようと思い、Monacaでtimepickerのよ

  • 解決済

    atom自動補完やり方

    これのプログラミング版になります 今いろいろ調べているのですが、atom自動補完ができません。宜しくお願い致します。 リンク内容 autocomplete-p

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    IntelliJ IDEA でKotlinの実行ができない

    実現したいこと IntelliJ IDEAで Kotlinのプログラムを実行したいです。 しかしエラーが表示されてしまいます。 ソースコード package sampl

  • 解決済

    vb2017でexcel2016操作

    vb2017を使っています。 communityです。 excel2016を開いてセルのデータを読み込みたいと思っています。 参考にしているサイトです。 http://d.

同じタグがついた質問を見る

  • C

    2961questions

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