プログラミングIII及び演習

この授業のE-Lerningのページは

https://moodle.yamanashi.ac.jp/2016/course/view.php?id=5288

です。レポートは、原則として、このページにPDF形式ファイルでアップロードしてください。

日にちは予定です。1週予備日を設けてあります。順調に進めばVIの課題を増やします。

2月1日 オンライン試験(2回め: 予定)

1回目で満足がいくレポートがかけた人は2回目を受けなくても構いません。

1回目は30点満点、2回目は24点満点で評価し、高いほうを採用します。

目次

0. 前準備 (10月5日) テキストに掲載されているプログラムのダウンロードとVisual Studioの準備

プログラミングIIでもVisual Studioを使っていると思います。その場合は、プログラミングIII用のプロジェクトを新たに作成するだけでOKです。

I. 連立一次方程式の解法 (10月5日、12日、19日)

II. 非線形方程式の解法(ニュートン法など) (10月19, 26日)

III. 微分方程式の解法 (11月2日、11月9日、11月16日, 11月30日)

IV. 数値シミュレーションへの応用(モデリングと可視化)(12月7日、14日、21日)

V. 偏微分方程式の解(ラプラス方程式の数値解を例に) (1月11日, 1月18日)

VI. 乱数とランダム過程 (1月18日)

1月25日、2月1日にプログラミングオンライン試験

VII. scilabを用いた数値計算

(今年は独自に取り上げないで,各章のなかでサンプルプログラムを提示する)


Tips

よくある質問、トラブルに関するメモはFAQに書きます。

(課題4関連)

memcpyとsizeof

配列変数xoldをxにまるごとコピーするのに

  memcpy(x, xold, sizeof(x));
を使っています.変数を宣言したmain関数中で使う場合は問題ないですが,x, xoldなどを別の関数にポインタを渡して処理をする場合は,呼び出した関数内ではsizeof(x)は違う意味を持ち,うまく行きません.

ポインタを渡された側では,sizeof(x)はポインタそのもののメモリの大きさ4(32ビットプログラム作成の場合)を返します. main文の中で利用した場合は,(2*N+2)*8(バイト)を返します.

ということで,わかって使っていれば,配列のコピーはmemcpyで良いのですが(プログラムが短くなるので),まちがいが起きやすいので,for文で各要素をコピーすることを推奨する人もいます.

  for(i=0; i< 2*N+2; i++) x[i] = xold[i];
コンパイラが,連続したメモリーのコピーであることを理解して最適化を行い,処理速度にも問題がない場合が多いようです.(確かめていませんが.)

参考ページ: http://dixq.net/forum/viewtopic.php?f=3&t=8890

プログラムをWordファイルにきれいに貼り込む

プログラムを,文書本文に直接挿入すると行間が空きすぎて見難くなりますし,また,説明文との区別もつきにくいです.それは次のようにして改善できます.

Scilabのインストール

ここで学ぶ数値計算及びテキストに載っている様々な計算法を簡単に利用できるソフトウェアがいくつかあります.(C言語にて使える数値計算ライブラリももちろんありますが,それについては,授業あるいは別の項に書きます.)

電気電子など工学系ではmatlabが頻繁に使われます.(が,高価です.) ここでは,自習でも使えるように,matlabと互換性が高いオープンソースソフトScilabを用います.matlabの文法は,かなりの確度でScilabに変換できますし,そのまま動くものも多いです.

各自のコンピュータにScilabをインストールして自習に役立ててください.

Scilabのページは,http://www.scilab.org/ です.

ソースの文字コード

コマンドプロンプトに日本語文字を出力するときには,文字コードがShift-JISになっている必要がある.文字化けするときは,「ファイル」→ 「保存オプションの詳細設定」で「日本語(シフトJIS)」に変更する.