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

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

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

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

C#

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

Q&A

解決済

3回答

26745閲覧

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

lemonads

総合スコア6

C

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

C#

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

0グッド

0クリップ

投稿2017/12/22 10:08

編集2017/12/22 10:14

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

イメージ説明
δ:光路差になります。
kで積分しprintf()で出力しています。
###発生している問題・エラーメッセージ

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

###該当のソースコード

C

1#include<math.h> 2 3int main(void){ 4 double R=6328e-10; 5 double D=163e-6; 6 double f=2978e12; 7 double A=1.0; 8 double X=100; 9 int T=100; 10 int N=1000; 11 12 double y,y1,y2,y3; 13 double t; 14 double S; 15 16 t=T; 17 y=0; 18 19 for(int i=0;i<2000;i++){ 20 int z=i-1000; 21 S=atan(z/X); 22 y=0; 23 for(int k=0;k<=N-1;k++){ 24 y1=k*D*sin(S); //位相差 25 y2=y1/N/R+f*t; 26 y3=A*sin(y2); 27 y+=y3/N; 28 } 29 printf("%i %f\n",z,y*y/t); 30 } 31 32 return 0; 33}

###補足情報(言語/FW/ツール等のバージョンなど)
Macで制作、CotEditというツールを使用、ターミナルでgcc,gnuplotとしています。

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

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

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

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

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

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

KoichiSugiyama

2017/12/22 11:23

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

2017/12/22 13:37

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

回答3

0

こんにちは。

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

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

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

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

投稿2017/12/22 13:06

Chironian

総合スコア23272

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

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

lemonads

2017/12/22 13:43

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

2017/12/22 14:09

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

0

自己解決

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

double error(int k,double D,double R,double x,double L,int N){
return Dksin(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/23 18:51

lemonads

総合スコア6

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

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

ozwk

2017/12/25 06:04

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

0

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

投稿2017/12/22 14:36

GOTA77

総合スコア160

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

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

lemonads

2017/12/23 18:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問