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

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

ただいまの
回答率

90.50%

  • C#

    7116questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3691questions

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

C言語でグラフを描写したい

解決済

回答 3

投稿 編集

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

lemonads

score 2

前提・実現したいこと

大学の授業の一貫で、プログラミングを利用した物理学現象を学習することになりました。
私は光の回折干渉、「フラウンホーハー回折、フレネル回折」をグラフに描写することにしました。
以下は与えられた式になります。
![イメージ説明](e2003bd1755c3747509a60d0c7a7a333.png)
A:振幅、N:スリットを分割する数、ω:各振動数、t:時間

イメージ説明
δ:光路差になります。
kで積分しprintf()で出力しています。

発生している問題・エラーメッセージ

各変数に具体値を入れてグラフを描写しても、まったく”それらしい”グラフになりません。

該当のソースコード

#include<math.h>

int main(void){
    double R=6328e-10;
    double D=163e-6;
    double f=2978e12;
    double A=1.0;
    double X=100;
    int T=100;
    int N=1000;

    double y,y1,y2,y3;
    double t;
    double S;

    t=T;
    y=0;

    for(int i=0;i<2000;i++){
        int z=i-1000;
        S=atan(z/X);
        y=0;
        for(int k=0;k<=N-1;k++){
            y1=k*D*sin(S);     //位相差
            y2=y1/N/R+f*t;
            y3=A*sin(y2);
            y+=y3/N;
        }
        printf("%i %f\n",z,y*y/t);
    }

    return 0;
}

補足情報(言語/FW/ツール等のバージョンなど)

Macで制作、CotEditというツールを使用、ターミナルでgcc,gnuplotとしています。

初めての質問投稿でわかりにくい点があると思いますが、解決案よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • KoichiSugiyama

    2017/12/22 20:23

    「まったく”それらしい”グラフになりません」とありますが、実際にどういう出力になっているか説明してください。それだけでわかる人にはピンと来ることもあります(単に軸の目盛りの取り方が悪いなど)。

    キャンセル

  • lemonads

    2017/12/22 22:37

    私が求めている・予想しているグラフはフラウンホーファー回折でした。それとは違い、歪な山が二つだけできるグラフとなりました。

    キャンセル

回答 3

+1

こんにちは。

C言語と標準ライブラリだけでグラフを描画することはできません。

グラフとしてプロットしたい点をprintfで出力されていると思いますが、その座標の位置に点を描き、座標軸を描いて初めてグラフになります。C言語は標準ではそのような機能を持っていません。
従って、何らかのグラフを描画できるようなツールを使う必要があります。

C言語でgnuplotを利用してグラフ表示という記事が有りました。これを見ると gnuplot を利用すれば容易にグラフを描画できそうです。
Gnuplot をインストールする( Mac ElCapitan/Sierra)を見ると、Macでも使えそうです。

私自身はGnuplotとMac上のコンパイラを両方とも使ったことはないので、具体的なことは分かりません。中途半端で申し訳ないですが、ヒントにはなるかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/22 22:43

    回答していただきありがとうございます。
    もちろんgnuplotを利用してグラフ描写を行なっています。
    ここで尋ねたいのが、理論上正しいグラフにならない、その理由・解決案なんです。
    …そもそも与式の問題かもしれないので、ここで(テラテイル)答えを求めるのは場違いだったかもしれません。
    知恵を貸していただき、ありがとうございました。

    キャンセル

  • 2017/12/22 23:09

    あっとと、確かにgnuplotを使っていると書かれてますね。見落としてました。すいません。
    確かにプログラミングというよりは数学の問題かもしれませんね。

    キャンセル

check解決した方法

0

include<stdio.h>
include<math.h>

double error(int k,double D,double R,double x,double L,int N){
return D*k*sin(atan(x/R))/L/N;
}

int main(void){
double y;                                //合成波
double x;                                //スクリーン干渉位置
double d;                                //光路差
double t=10e-15;                    //時間
double f=2985e12;                //各周波数
double R=2500;                    //スリットスクリーン距離
double L=6328e-10;            //波長
double D=163e-6;                //スリット幅
double A=1.0;                        //振幅
int N=100;                            //スリット分割数

for(int i=-10000;i<10000;i++){
y=0;
x=0.01*i;
for(int k=0; k<N; k++){
d=error(k,D,R,x,L,N);
y+=A*sin(f*t+d)/N;
}
printf("%f %f\n",x,y*y/t);
}
return 0;
}

正直どういった点が違っていたのかわかりませんが、このコードで求めることができました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/24 11:32

    y2の計算で桁落ちしているようですね。
    http://tooljp.com/jyosho/docs/ketaochi-jyohoochi/ketaochi-jyohoochi.html
    特に数値計算プログラムを書く時は良く注意した方が良いです。

    キャンセル

  • 2017/12/25 15:04

    元のコードと比べるとスクリーン位置の積分範囲と
    スクリーン距離が全然違いますね

    キャンセル

0

y2=y1/N/R+f*t; のところはfではなくてω(2πf)では?
何の定数か分からないところもあるので他にもあるかもしれないけど。
変数は一文字にこだわらないでわかりやすく書いたほうがいいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/24 03:48

    回答ありがとうございます。
    説明不足でした。私はfを角振動数と置いているので、fで問題ありません。
    ωの方がわかりやすいのはもちろんですが、媒体によってエラーが出ることがあったので、fと置いています。

    キャンセル

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

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

関連した質問

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

  • C#

    7116questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3691questions

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