[分割コンパイルの復習]
cc -c sample.c (sample.oというオブジェクトファイルを生成)
cc -c sub1.c (sub1.o というオブジェクトファイルを生成)
cc -c sub2.c (sub2.o というオブジェクトファイルを生成)
cc -o sample sample.o sub1.o sub2.o (sample.o sub1.o sub2.oの3つをリンク
してsampleという実行ファイルを生成)
上の4行は
cc -o sample sample.c sub1.c sub2.c と同じ.
ヘッダファイルを修正したときには,
それを include しているファイルすべてを再コンパイルする必要がある.
↓ 覚えるのは大変
↓ make の利用 13.Make
Makefileまたはmakefileというファイルに分割コンパイル時のファイルの依存関係と処
理方法を記述.
↓
部分的な変更があった場合,変更が及ぶ範囲だけを処理する.
ファイル include しているヘッダ sample.c ← config.h inc1.h inc2.h sub1.c ← config.h inc1.h
sub2.c ← config.h inc2.h makefile の例
---<ここから>---
#
# 簡単な makefile の例
#
all: sample
sample: sample.o sub1.o sub2.o
cc -o sample sample.o sub1.o sub2.o
sample.o: sample.c config.h inc1.h inc2.h cc -c sample.c
トップレベルのターゲット
[書式]
作りたいファイル:必要なファイル と 依存関係
(TAB)ファイルを作るのに必要なコマンド
上のmakefileをsample.c sub1.c sub2.c config.h inc1.h inc2.hと同じディレクトリ におき,
make と入力すると
cc -c sample.c cc -c sub1.c cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o が実行される.
このあと
a) sample.cだけを変更したとき,makeと入力すると cc -c sample.c
cc -o sample sample.o sub1.o sub2.o b) sub1.cだけを変更したとき
cc -c sub1.c
cc -o sample sample.o sub1.o sub2.o c) inc2.hだけを変更したとき
cc -c sample.c cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o d) config.hだけを変更したとき
cc -c sample.c cc -c sub1.c cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o がそれぞれ実行される.
[補足と参考]
• sub1.oだけを生成したいときは make sub1.o
と入力すればよい.
• 上のmakefileをsample.makeというファイル名で作成したときは make -f sample.make
と入力すればよい.
• makefileの中では変数が使用可能.
(例)
OBJ = sample.o sub1.o sub2.o INC = config.h inc1.h inc2.h LIB = -lm
sample: $(OBJ)
cc -o sample $(OBJ) $(LIB)
sample.o: sample.c $(INC) cc -c sample.c
sub1.o: sub1.c config.h inc1.h cc -c sub1.c
sub2.o: sub2.c config.h inc2.h cc -c sub2.c
makeのより高度な利用法については各自で調べて下さい.
演習問題
12. (ガウスの消去法の後半部分)上三角行列の線形方程式(対角成分は非零とする)
÷÷
÷÷
÷ ø ö çç çç ç è æ
=
÷÷
÷÷
÷ ø ö çç çç ç è æ
÷÷
÷÷
÷ ø ö çç
çç ç è æ
n n
nn n n
b b b
x x x
a a a
a a
a
M M
L
M O O M
L L
2 1 2
1 2 22
1 12
11
0 0
0
の解を求めるプログラムを作成しなさい.また,それを用いて,
÷÷
÷÷
÷ ø ö çç çç ç è æ
= −
÷÷
÷÷
÷ ø ö çç çç ç è æ
÷÷
÷÷
÷ ø ö çç
çç ç è æ
1 2 3 5
4 0 0 0
7 3 0 0
9 6 2 0
10 8 5 1
4 3 2 1
x x x x
の解を求めよ.
13. 演習問題 11 で作成した二分法とニュートン法のプログラムを,多項式用に修正せよ.
すなわち,関数を直接プログラムに書くのではなく,次数と係数を入力すればよいよ うに改めよ.(例えば,f(x)=5x3+ x2 −4x+2であれば,3,5,1,−4,2と入力する.)
(cc -o sample sample.o sub1.o sub2.o –lmと同じ)
レポート課題
[基本課題](これができなければ不合格)
1. 演習問題12の前段階として,以下の手順を付け加えて線形方程式
÷÷
÷÷
÷ ø ö çç çç ç è æ
=
÷÷
÷÷
÷ ø ö çç çç ç è æ
÷÷
÷÷
÷ ø ö çç
çç ç è æ
n n
nn n
n n
b b b
x x x
a a
a a
a
a a
a
M M
L L
M O M M
L L
2 1 2
1
1
2 22
21
1 12
11
を解くガウスの消去法のプログラムを完成させよ.
手順
1 , , 2 ,
1 −
= n
k L
n k
k
i= +1, +2,L, n k
k
j = +1, +2,L,
kj kk ik ij
ij a a a a
a = −( / )×
k kk ik i
i b a a b
b = −( / )×
また,これを利用して問題1の解を求めよ.
2. 問題2の7次方程式の実数解(数値解)をすべて求めよ.
[発展課題](できなくてもよい)
3. 課題1では,計算の途中でakk =0となった場合が考慮されていない.そのときはどう 処理すればよいか.処理を施したプログラムを作成せよ.また,問題3の解を求めよ.
4. Newton法には,
• 収束が早い(二分法などと比較して)
• 必ずしも収束しない(適当な初期点からはじめるといつまでも止まらない)
という特徴があります.これらの特徴が確認できるような問題例を示せ.また,その ときの実行結果を示せ.
なお,問題1〜3は http://www-tamlab.sys.es.osaka-u.ac.jp/~taji/lecture/lecture.html に あります.
締 切
:11112222月月月21月2121日21日日日((((金金金)12金)12)12)12時時時(時(((期限厳守期限厳守期限厳守期限厳守)))) 提出先:システム事務室
問題3のファイルデータの説明
このテキストファイルは,まず1行目に行列の次元(方程式の数)が書かれています.
2行目から,−1 −1 −1 の行までは行列Aの要素であり,それぞれの行は i j aij を表しています.そのあとに,右辺のベクトルbの要素が続き,各行は i bi となってい ます.最終行の −1 −1 はデータのおわりを示しています.また,要素の値が 0 である ところは,省略しています.
例えば,
÷÷
÷ ø ö çç ç è æ
−
÷ =
÷÷ ø ö çç
ç è æ
−
−
4 0 1
1 4 0
5 2 2
3 0 1
x
という問題例の場合,データは,
3
1 1 1 1 3 3 2 1 −2 2 2 2 2 3 5 3 2 4 3 3 −1
−1 −1 −1 1 1
3 −4
−1 −1 となります.
行列要素のおわりを示す 行列の要素データ(1行2列は省略)
右辺のデータ 3行3列である
データの終わりを示す