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

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

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

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

Q&A

解決済

1回答

1272閲覧

C言語初心者です。磁場の計算にて、台形公式を用いた重積分がうまくいきません。

tohokuplug

総合スコア13

C

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

0グッド

0クリップ

投稿2019/01/11 14:35

編集2019/01/12 08:29

永久磁石がある点に作る磁束密度をC言語にて計算したいと考えています。

計算がうまくいかず、どこに間違いがあるのか見つけられていないので、
電磁気ないしC言語に見識のある方のお力添えを頂きたく存じます。

表面磁場 M = 0.24 T
磁石長さ L = 1 mm (y軸方向)
磁石幅 W = 1 mm (z軸方向)
の磁石がある点に作る磁場を求めます。

磁石表面がy-z表面上にあるとして、長さ方向(y軸方向)にn分割してdy、幅方向(z軸方向)にm分割してdzとし、
それぞれの領域が作る磁場をyとzに関する重積分で重畳して求めようとしています。

この時、磁石の表面磁束密度を M で一様だと仮定すると、分割された各要素の
持つ磁極の強さは dydzM [Wb] となります。

したがって、磁場のクーロンの法則より、各要素から r [m]離れた点に磁石の要素が作る磁場dHは、

dH = (1/4πµo) * {(dydzM) / r^2}

磁束密度dB [T]に直して、

dB = (1/4π) * {(dydzM) / r^2)}

ここで、
要素の座標が ( xs0 , ys0 , zs0 ) (添え字はソース点の意味でsです。読みにくくてすみません)
磁束密度を求める点が ( x , y , z )
だとすると、2点間の距離 r = √{(x-xs0)^2 + (y-ys0)^2 + (z-zs0)^2} なので

dB = (1/4π) * [(dydzM) /{(x-xs0)^2 + (y-ys0)^2 + (z-zs0)^2}]

さらに、x軸方向の磁束密度を求めたいため

dB = (1/4π) * [(dydzM) /{(x-xs0)^2 + (y-ys0)^2 + (z-zs0)^2}] * [(x-xs0) / √{(x-xs0)^2 + (y-ys0)^2 + (z-zs0)^2}]

としてそれぞれ求め、これを
y軸方向に 0 → 10^(-3) [m]
z軸方向に 0 → 10^(-3) [m]
の範囲で積分して計算しています。

ここまでで間違いはございますでしょうか。
簡単な静磁場の計算ですが、得手でなくお恥ずかしい限りです。

積分には台形公式を用いています。以下、実際のソースコードになります。
磁束密度を求める点は ( 10^(-3) , 0 , 0 )としています(磁石表面の原点から垂直方向に1 mm の位置)

このプログラムで計算すると、エラーは出ないのですが、解が異常に小さく出たり、
分割数を変えると解の大きさが1桁単位で変化したりと、明らかに間違っており、
おそらくどこか基礎的なことで躓いていることは予想できるのですが、
具体的にどこが間違っているのかが分かりません。

見識ある方のお力添えを頂きたく存じます。

lang

1#define _USE_MATH_DEFINES 2#include<stdio.h> 3#include<math.h> 4#define f(ys0,zs0) ((x-xs0)*M)/(4*M_PI)/((x-xs0)*(x-xs0)+(y-ys0)*(y-ys0)+(z-zs0)*(z-zs0))/sqrt((x-xs0)*(x-xs0)+(y-ys0)*(y-ys0)+(z-zs0)*(z-zs0)) 5 6int main(void) { 7 int n, m, i; 8 double L1, L2, W1, W2, M, xs0, xs1, x, ys0, ys1, y, zs0, zs1, z, dy, dz, dSy1, dSy2, Sy1, Sy2, dV, V; 9 10 //要素分割数 11 n = 1000; 12 m = 1000; 13 //-- パラメータの設定 14 L1 = 0.000;//yの下限値(磁石の長さ) 15 L2 = 0.001;//yの上限値 16 W1 = 0.000;//zの下限値(磁石の幅) 17 W2 = 0.001;//zの上限値 18 M = 0.240;//磁石の磁界強度 [T] = [Wb/m^2] 19 xs0 = 0.000;//ソース点 20 x = 0.001;//目標点 21 y = 0.000;//目標点 22 z = 0.000;//目標点 23 //-- 24 //微小量の定義 25 dy = (L2 - L1) / n; 26 dz = (W2 - W1) / m; 27 //初期化 28 V = 0; 29 30 //-- 積分 31 for (i = 1; i < (n-1); i++) { 32 //y軸ソース位置の指定 33 ys0 = L1 + dy * i; 34 ys1 = ys0 + dy; 35 //ループ毎の初期化 36 Sy1 = 0; 37 Sy2 = 0; 38 for (i = 1; i < (m-1); i++) { 39 //z軸ソース位置の指定 40 zs0 = W1 + dz * i; 41 zs1 = zs0 + dz; 42 //y軸方向の微小面積計算 43 dSy1 = (f(ys0, zs0) + f(ys0, zs1)) * dz / 2; 44 dSy2 = (f(ys1, zs0) + f(ys1, zs1)) * dz / 2; 45 printf("dSy1 = %lf\ndSy2 = %lf\n", dSy1, dSy2); 46 //y軸方向の面積総和 47 Sy1 += dSy1; 48 Sy2 += dSy2; 49 } 50 //z軸方向の微小体積積分 51 dV = (Sy1 + Sy2)*dy / 2; 52 //z軸方向の体積総和 53 V += dV; 54 } 55 //-- 積分終了 56 57 printf("磁束密度 %lf [T]\n", V); 58 getchar(); 59}

試したこと

分割数の変更、各パラメータの値の変更、台形公式の見直し、簡単な関数での重積分結果と比較など

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

Microsoft Visual Studio 2017 を使用

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

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

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

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

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

KSwordOfHaste

2019/01/11 15:01 編集

> ※は見出し表示の回避 これは正しい解決法ではありません。見出し表示を回避できたとしても字下げが再現されません。 https://teratail.com/help#about-markdown の「コードを入力」の項に正しい書き方があります。それを参考に質問文を編集ください。質問文の投稿・編集のページ右側にプレビューが表示されていると思いますのでそれで適切な表示になっていることを確認できると思います。 --- また、タイトルの「C言語初心者です」は蛇足なので削除ください。その代わり質問編集画面の左上の初心者マークをクリックし、質問自体に初心者マークを付与してください。
tohokuplug

2019/01/12 08:31

ご指摘頂き誠にありがとうございます。ご指摘内容について修正いたしました。以降の投稿では気を付けます。
guest

回答1

0

ベストアンサー

forループがどっちもi

投稿2019/01/11 23:50

ozwk

総合スコア13521

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

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

tohokuplug

2019/01/12 08:32

解決いたしました。ご指摘頂きまして誠にありがとうございます。非常に初歩的なところでしたので、反省しきりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問