演習問題

問題1  次のプログラムは,ループを繰り返す毎にループ変数 ii と変数 aの値を画面に
      表示し,1+2+3+…・……+10の合計を求めるプログラムです。
      
      (1) ii の値に対応して a がどのように変化しているかを調べ,算術代入文の働きを
         確認しなさい。
      (2) fprintf 文を用いて,ii=________,a=______ と表示されるようプログラムを修正しなさい。
            

  % prob_1.m
  a=0;
    for ii=1:10
     ii
     a=a+ii
    end
  

        
問題2 
      においてa=10,d=5,n=100とした場合のSを求める
     プログラムをfor〜end文を用いて作成せよ。
     更に上記プログラム末尾にステートメントを追加して,初期値 a ,最終値 a+(100-1)*d ,
     増分値 d=5 を与えるベクトルを発生させ,和を求める関数 sum を用いて,上記で得られ
     た S の値が正しいことを確認しなさい。

問題3 
     を求めるプログラムを指示に従い作成せよ。
     ただし,面積を求めるには次の台形公式を使用する。

                  
                                  
                              △xが0に近づく程,近似の精度はよくなる。

     (1) △x=0.01とし,a=1.0,2.0,3.0とした場合の各々の面積を求めよ。
         出力結果は,次のように表示すること。
                  s(1)=__________
                  s(2)=__________
                  s(3)=__________
     (2) 被積分関数を次式に示すように変更し,△x,aの条件は上に同じとした場合の
        面積を求めよ。
                 
     (3) 面積を求める関数 quad ,quadl の用い方をヘルプで調べ,上記プログラムの末尾
        にこれらの関数を用いたステートメントを追加し,出力結果を比較しなさい。
        (ただし,ファンクション・Mファイルに関する理解も必要です。)
            参考例 
               スクリプト・Mファイル側     
                    s=quadl('ファンクション名',積分下限値,積分上限値)
               ファンクション・Mファイル側
                    function ファンクション名(x)
                       y=f(x)            
              (ただし,f(x)は被積分関数で問題に応じて具体的に記述する)
                                  
問題4 上の問題1のプログラムを基に1+2+3+……+n (n=1000とする)を求める際,
     n=100,200,300,・…,1000の途中結果も表示するようにプログラムを修正せよ。
     ただし,if 文(条件に余りを返す関数 rem を利用;テキストp.29参照)を用いること。

問題4-1 
     
2次方程式の解と係数の関係を参照し,if文を用いて判別式の値に応じて3通りに
      場合分けして解を求めるプログラムを作成しなさい。matlabは複素数を扱えるが,
      この問題はif文の練習です。
       なお、係数a,b,cはinput文で与えること。虚数解を表示するために、テキストp.200に
      掲げられている次の関数を使用しなさい。
          num2str : 数字を文字列に変換, strcat  : 文字列の結合
           2次方程式の解と係数の関係は次式で表せられる。
                 

           判別式:
                  D>0〜2つの実数解がある場合
                             D=0〜重解の場合
                             D<0〜2つの虚数解がある場合
          
問題5 表に示す2回分のコンクリート圧縮強度実験データを2次元配列変数 f(ii,jj) 
     (添字の意味:ii;班名1〜6,jj;実験データ1〜2)に代入し,下記に示す要求を満たす
     プログラムを for〜end 文と if 文を用いて作成せよ。

            班名    実験データ1回目     実験データ2回目
            1班         22             18.5
            2班         20             23
            3班         19.5            20
            4班         22             21
            5班         17             19
            6班         21             22

                           ※ 圧縮強度の単位(N/mm^2)

      (1) if文を用いて,全実験データの最大値fmax,最小値fminを求めよ。
          また、MATLAB関数 max, min を用いると,()内をf(:)と表現した場合には
          全体の最大値,最小値が得られ、()内をf(:,:)またはfと表現した場合には
          列毎の最大値,最小値が得られることを確認せよ。
      (2) if文を用いて全実験データの内,21N/mm^2末満の実験データ個数と
          21N/mm^2 以上の実験データ個数を求めよ。
      (3) 2回の平均値が21N/mm^2 以上を合格とした場合,合格となる班名を
         出カせよ。

問題6 表に示す15人分の身長と体重のデータを身長h(ii),体重w(ii)に代入し,次の要求を
      満たすプログラムをfor〜end 文と if 文を用いて作成せよ。

        身長: 173,171,165,165,173   体重:65,55,62,58,77
            175,174,167,163,165       58,68,58,55,68
            160,167,170,180,170       53,65,56,80,70

      (1) if文を用いて,身長の最大値 hmaxを求めよ。
      (2) for〜end文を用いて,身長の平均値haver,体重の平均値waverを求めよ。
      (3) 下式を参考に,身長,体重のサンプルとしての標準偏差hsd,wsdを求めよ。
                   ただし,,n:データ個数
      (4) 下式を参考に,相関係数rを求めよ。
               
      (5)下式を参考に,回帰直線の傾きaを求めよ。
                
                 ただし,xに身長,yに体重を対応させる
      (6)上記の(1)〜(3)は,テキストpp.117,118に掲載されているMATLAB関数を用い,
         簡単に得られることをプログラム末尾にステートメントを追加して確認せよ。
         なお,xにデータを保存して標準偏差値を求める関数stdを使用する際,
         std(x)またはstd(x,0)とした場合には,根号内の分母は(n-1)と見做され,
         std(x,1)とした場合には根号内の分母はnと見做されるので注意のこと。

問題7 一級建築士の学科試験を行った結果,10人分のデータが次のようであった。

             受験者NO.  構造    施工   計画   法規
             −−−−−−−−−−−−−−−−−−−−−−
                1      65     50    72    43
                2      58     55    60    85
                3      80     65    75    65
                4      55     30    50    45
                5      75     60    65    70
                6      90     55    60    60
                7      40     45    50    70
                8      50     65    40    65
                9      80     58    39    50
               10      60     65    57    65

      以上のデータを基に以下の設問を満たすプログラムを順に作成し,最終的に1つの
     大きなプログラムを作成せよ。
      ただし,変数名は指定したものについてはそれを用い,ループ変数はii〜nを
     使用すること。

    (1) 先ず,各学科の試験結果を算術代入文を用いて変数名t(ii,jj)に読み込みなさい。
        ただし,各受験者NO.にii=1〜10,科目名(構造〜法規)にjj=1〜4を夫々
        対応させるものとする。
    (2) for〜end文を用いて,各受験者の合計点および各科目の平均点を夫々求めよ。
        変数名は合計点:total(ii),平均点:aver(ii)とする。添字iiは1次元の配列変数
        であることを意味する。
        別途,ステートメントを追加してMatlab関数のsum( )とmean( )を用いて上と同じ
        合計点,平均点を求めよ。

    (3) if文を用いて,次の基準に従い学科試験の合格者を判定せよ。
    a) 4科目とも60点以上の受験者は無条件に合格とし,その受験者NO.を出力せよ。
         ただし,4科目とも60点以上か否かの判断は次の設問の準備を兼ねて60点
         未満の科目数をカウントし,その値が0の場合に全て60点以上と見倣すように
         すること。
    b) 4科目中1科目のみ60点末満であるが,その点数が受験者の平均点以上であり,
      かつ4科目の合計点が240点以上である場合には合格とする。この条件を満たす
      受験者NO.を出力せよ。
         
ヒント
           60点未満の科目数が1つのみの受験者について何番目の科目がそれに
          該当するのかを適当な変数に保存し,論理積(&&)を用いたif文で判定を行う。

問題8
 マトリックス[a]と列べクトル{x}の積{y}を求めるプログラムをfor〜end文を用いて
      作成せよ。
       なお,[a]および{x}の各要素の具体的なデータは下記の通りとし,データを変更
      した場合でもなるべく修正の少ないプログラムとなるよう心がけること。
       また,上記の計算はfor〜end文を用いなくともMatlabのマトリックス×列べクトルの
      演算で,1行で記述できることを確認しなさい。

         

      次の一般例を参考に添字がどのように変わるかに着目し,配列変数の添字および
      ループ変数をどのように設定すれば目的の計算が可能になるか考えよ。
         

      上記の掛け算は,マトリックスを展開すると次のようになる。

         

問題9
  問題6で作成したプログラムに追加する形で,次の設問に答えなさい。

  (a) 身長を横軸に体重を縦軸にとり,2次元のプロット関数plot( )を用いて散布図を作成
     するプログラムを作成せよ。図中にはline文を用いて平均値を通り傾きaの回帰直線
     式を表示しなさい。さらに図中の適当な位置に身長,体重の平均値と標準偏差値を
     例えば,下記のように表示されるよう出力せよ。
              haver=     
              waver=     
              hsd=     
              wsd=     
      なお,表示に際しては,text( )関数を用いること。( )内は文字列変数または文字列
     であるので,テキストp.200に示されている数値を文字列に変換するnum2str( )関数,
     文字列を結合するstrcat( )関数を用いて,text( )関数の( )内の文字列を作成しなさい。
  (b) 次に示す式を参照して,上記で求めた回帰直線に対する縦軸の値w(ii)の残差平方和
     の平方根を求めなさい。
                   


問題10 次のデータは,2クラス分の中間試験の結果の一覧である。そのデータを基に,
      以下の要求を満たすプログラムを作成しなさい。

          % protest data of 121 students
          5,24,42,89,36,10,7,70,18,20
          10,45,18,2,46,30,18,18,35,18
          2,74,14,10,39,10,10,57,22,67
          18,107,10,0,109,10,8,81,46,40
          6,70,26,46,13,0,22,88,0,7
          13,30,0,3,16,10,8,18,18,20
          0,7,85,20,10,0,101,5,110,66
          20,15,45,8,13,34,2,111,26,50
          22,118,18,9,66,78,12,10,0,108
          10,10,30,2,9,10,10,8,20,6
          70,2,63,63,0,12,40,12,60,54
          6,10,51,20,20,10,10,115,60,14
          38
          % wrtest data of 121 students
          22,31,28,32,22,27,22,28,30,24
          27,27,30,27,27,30,22,28,27,22
          16,24,24,24,29,28,25,30,19,26
          29,15,25,25,25,30,9,28,26,25
          18,21,30,35,20,27,28,30,23,23
          18,29,17,23,29,30,24,25,22,20
          26,22,27,22,25,24,31,18,32,26
          25,17,25,26,31,27,22,34,18,29
          19,42,19,26,25,25,21,25,24,31
          28,24,25,24,30,24,26,30,28,29
          30,27,19,22,28,27,26,24,24,20
          29,31,29,12,25,27,30,43,27,28
          30

     a) 算術代入文を用いて,プログラム作成の試験結果をptest(ii)に,記述式試験結果
        をwtest(ii)に読み込みなさい。上のデータは半角で入力してあるので,Matlabに
        カット&ペーストで持っていけます。但し,全角スペースが各行に挿入されるので
        削除してから使用してください。
         次いで,ptest(ii)の平均値paveとwtest(ii)の平均値waveおよびptest(ii)の
        
標準偏差値psdを求めなさい。

     b) 横軸にプログラム作成試験の結果ptest(ii),縦軸に記述式の試験結果wtest(ii)
        とり,散布図をsubplot(2,2,1)の位置に作成せよ。なお,図中にはa)で求めた
        平均値(pave,wave)をプロットし,さらに図中の適当な位置にpave,waveの値も
        表示しなさい。
     c) プログラム作成試験点数ptest(ii)について,次の区間にある点数の人数を求め
        なさい。
              0<=ptest(ii)<10
             10<=ptest(ii)<20
                     :
                     :
            110<=ptest(ii)<=120
        上の結果を基に,横軸にptest(ii)の点数,縦軸に区間の人数をとった棒グラフを
        subplot(2,2,2)の位置に作成しなさい。
        なお,棒グラフはMatlab関数のbar関数を参照し表示すること。
     d) 次の正規分布を表わす関数式を参考に,ミューに平均値pave,シグマに標準偏差
        値psdを代入して,区間−70〜130のグラフをsubplot(2,2,3)の位置に表示しなさい。
                       

        なお,図中には平均値paveの縦線と平均値からそれぞれ±1シグマ±2シグマ
        ±3シグマだけ
離れた位置を表わす適当な長さの縦線を表示しなさい。
        さらに平均値,標準偏差値も図中の適当な位置に表示しなさい。

問題11(難問) 余力のある人は考えてみて下さい。
    for〜end文,if文を用いて,逆さピラミッドゲームの答えを求めるプログラムを作ってみよう。
      ゲームのルール
         1)1から9までの数字を1回用いて9桁の数字を作ります。
          (同じ数字は2回使えません)
         2)隣あっている数字を足してその下に書きます。ただし,答えが10より大きいときは
          1の位の数字だけ書きます。
         3)上の2)の操作を繰り返して,最後の2桁の数字があなたの得点です。
 

               例)          5 6 4 1 7 2 3 9 8
                            1 0 5 8 9 5 2 7
                             1 5 3 7 4 7 9
                              6 8 0 1 1 6
                               4 8 1 2 7
                                2 9 3 9
                                 1 2 2
                                  3 4
               この例の得点は,34点です。

      あなたの得点が99点となる9桁の数字を求めるプログラムを作成して下さい。
         条件を満たす9桁の数字は,全部で何通りありますか? 
         条件を満たす9桁の数字を打ち出して下さい。

問題12 テキスト53ページを参照して,テキスト54ページの演習3.2を実行しなさい。
       ただし,パラメータAは1,パラメータBは0.5とし,問題文で与えられている4つの
       2変数関数は夫々異なるファンクション・mファイルで関数値を求める仕様とすること。
       また,4つの図形はひとつのfigureに2×2分割して表示すること。

問題13
 スクリプト・mファイルでxが0から3まで刻み幅0.01で変化するとしたとき,次の関数
       値ひとつのファンクション・mファイルの中で求め,再びスクリプト・mファイルに戻り,
       それらの関数値
のグラフを表示するプログラムを作成せよ。

              y1=sqrt(x),y2=exp(x),y3=log(x)
                 注) log( )は,自然対数

       ただし,3つのグラフは重ね書きし,legend関数を用いて凡例を表示すること。
       また,x=0のときにはlogを定義できないので,テキストp.53のプログラムリスト
       3.5のX=0,Y=0の処理にならい,次のように記述しなさい。

           for ii=1:length(x)
               if x(ii)<eps
                  x(ii)=eps;
              end
           end

           または

           x(1)=eps;  
%何故なら,x(ii)=0となるのはii=1のときだけだから

問題14 アスキーファイル(フォーマットなし)の作成および読み込みを行う以下の
       プログラムを作成せよ。

 (a) 問題8の[a]および{x}のデータを算術代入文で読み込み,それをアスキーファイル
     として保存するプログラムを作成せよ。
     ただし,アスキーファイル名は夫々mat_a.asc,vect_x.ascとする。
 (b) 上記のアスキーファイルからデータを読み込み{y}=[a]{x}を求めるプログラムを
     (a)のプログラムとは別に作成した後,さらに{y}の値をアスキーファイル名vect_y.asc
     として保存するプログラムを作成せよ。
 (c) Import Wizardで保存したファイルを表示し,テキストファイルが作成されていることを
    確認せよ。

問題15 上の問題14においてアスキーファイルをバイナリファイルに読み替えて,(a),(b)に
    対応する設問のプログラムを作成せよ。ただし,拡張子.ascはbinに読み替えること。

問題16 住宅の新築計画にあたり,自己資金を除く残金は全てローンを組むことにした。
    100万円を借りたときの月々の返済額の早見表が次のように与えられているとき,以下
    の要求を満たすプログラムを作成せよ。

        100万円を借りたときの月々の返済額早見表(単位:円)        
                      期間
  年利 20年 21年 22年 23年  24年 25年  26年 27年 28年  29年 30年
  5%  6599 6417 6252 6104 5968 5845 5733 5630 5535 5448 5368
  6%  7164 6988 6830 6688 6559 6443 6336 6239 6151 6070 5995
  7%  7752 7584 7434 7299 7177 7067 6968 6878 6796 6721 6653
  8%  8302 8141 7997 7869 7755 7652 7559 7475 7399 7330 7268

 (1) 上記表の返済額を算術代入文で読み込み,アスキーファイル(書式なし)を作成する
     プログラムを作成せよ。ただし,変数名は次に従うこと。表中の金額 :mm(ii,jj)
 (2) アスキーファイルの内容を読み出すプログラムを新たに作成し,次いで以下の要求を
    満たすプログラムを作成せよ。ただし,(a)はスクリプト・mファイルに,(b),(c)は夫々
    別のファンクション・mファイルに記述せよ。
    (a) 横軸に借り入れ期間,縦軸に返済額をとり,上の表を折れ線グラフで表示しなさい。
        グラフの中には凡例も表示のこと。
    (b) 新築費用(万円),自己資金(万円),ローン期間(年),年利(%)をinput文で入力し,
        月々の返済額(円)を算定せよ。ただし,変数名は次に従うこと
         新築費用:cost,自己資金:smoney,ローン期間:y,年利:r,月々の返済額:s

         計算式〜 s=(cost-smoney)/100*mm(ii,jj)
    (c) 自己資金(万円),年返済可能金額(万円)をinput文で入力し,年利7%,返済期
       間を20年,25年,30年とした場合の新築物件のローン金額と購入可能金額上限
       値を算定せよ。変数名は次に従うこと。年返済額:backm,融資金額:loanm

          計算式〜 loanm=((backm/12)/mm(3,k))*1000000   
                 ただし,式中のbackmの単位は円
                 total=smoney*10000+loanm

  以下の問題については,余力のある人は考えてみましょう。
問題17 真分数を与えて,小数点以下100桁まで正確に求めるプログラムを作成しなさい。
      ただし,割り切れる場合には,その桁数までの打ち出しとしてください。 
      この問題は,ある本で読んだ京都大学の情報処理演習の問題を参考にしました。
      すっきりとした良問なので,是非トライしてください。
      ヒント:筆算の割り算を想い出してください。
          次のMtlab関数
; fix, mod, num2str, strcat を上手に使いましょう。

問題18 円周率を有効数字15桁まで正確に求めるプログラムを作成しなさい。
      円周率とは,直径に対する円周の長さの比率のことです。故に直径1の円の
      周長は円周率に等しくなります。
       考え方:
       直径1の円を描きます。その円に外接する正多角形と内接する正多角形を
      描きましょう。そのとき,以下の不等式が成立します。
          
外接正多角形の周長>円周長>内接正多角形の周長
       このことを踏まえて四角形から順に辺の数を増していくと,次第に上記不等式の
      範囲はせばまり,正確な円周長,即ち円周率が求まります。
       因みに,内接正6角形は辺の長さが0.5の正三角形6つで構成されているので,
      その周長
は3となります。

      ヒント:
       正多角形の辺の数を増していくと,その周長がどの様な式で表示されるのか?
      内接正多角形の式の規則性は見出し易いので,簡単のために片方の不等式のみ
      を考慮して円周率を求めて
みましょう。プログラムは10行少々で記述できます。

H25年度期末試験データ
 三笠_日間降雪量(cm)
   15 24 36 1 0 0 2 41 1 0 0 11 1 0 0 0 4 4 0 4 9 23 1 24 2 3 1 48 26 10 1 12 36 18
   17 18 6 0 3 5 1 46 10 10 0 8 3 0 7 0 1 10 1 9 0 7 8 12 15 63 50 26 20 4 1 13 0
   0 8 7 4 8 0 22 17 1 1 3 1 0 14 2 10 2 0 6 61 37 17 38 30 11 6 10 25 3 0 2 7 10
   0 2 0 1 5 7 3 0 2 0 1 0 2 0 1 0 0 0 0 0 0 1 0 0 0 1 19 20 5 1 0 1 5 10 0

 三笠_積雪量(cm)
   15 32 55 36 21 12 6 46 31 10 7 18 16 9 5 3 7 10 6 9 16 37 33 55 45 43 41 67 76 77
   65 72 91 98 97 99 93 83 83 76 75 112 110 109 100 105 99 93 95 86 86 93 93 98 94
   95 103 112 118 162 167 165 164 153 144 145 135 130 134 134 133 132 128 144 148 141
   137 136 133 128 139 133 137 133 126 128 168 180 174 190 193 190 180 179 189 182
   180 172 169 174 164 162 158 157 159 163 159 154 146 145 147 145 146 140 136 135
   134 131 130 130 129 129 127 124 122 120 127 142 139 128 124 125 129 136 128

幾春別_日間降雪量(cm)
   25 35 33 1 0 0 8 52 6 0 0 23 6 0 0 1 2 4 0 7 10 28 3 25 3 2 3 53 31 24 1 18 28
   19 11 22 6 0 5 7 2 65 25 13 0 13 3 0 9 1 2 7 6 13 0 7 6 23 24 65 48 26 9 3 1 13
   0 0 2 6 17 11 0 30 16 3 2 2 1 0 8 6 12 6 2 7 41 62 17 38 31 15 7 23 20 3 0 4 8
   5 5 4 0 3 5 2 9 0 2 0 2 0 2 2 1 1 0 0 7 0 0 1 2 0 0 1 24 25 11 3 0 1 8 11 0

幾春別_積雪量(cm)
   25 52 70 60 36 17 16 56 50 21 15 33 27 17 12 10 12 14 13 16 22 43 41 60 56 53 54
   90 106 112 93 97 118 125 121 127 122 108 105 105 103 146 155 160 153 160 153 135
  135 125 125 126 128 140 135 137 135 150 160 190 205 212 202 195 186 188 175 171
  170 173 182 186 178 203 207 196 192 190 186 183 185 186 192 186 182 185 210 248
  252 265 274 260 245 250 256 248 238 235 232 235 230 225 220 220 223 223 226 218
  215 212 208 206 205 196 190 187 185 182 184 182 180 176 174 172 168 166 185 206
  198 186 182 180 186 195 186

目次へ戻る