中間試験解等解説


必答問題(問題1〜5まで答えよ)

問題1. プログラム上で複素数を定義したい.構造体を用いて複素数を定義せよ.

解答例

struct Complex
{
 double re; /* 実部 */
 double im; /* 虚部 */
};

問題2. プログラム上で複素数を構造体で定義した場合,どのようなことに注意すべきか説明せよ.特に数学的な意味合いとの違いについて示すこと.

解答例

以下のような説明があればよい.



問題3. 問題1で定義した構造体を用いて10個の配列を作りたい.main関数内でどのように定義し,i番目の配列にどのように数値を与えるか答えよ.

解答例

int main(){
/*以下に定義する*/
Complex z[10];
 int i;

/*以下にi番目の配列に数値を与える*/
 z[0] = 1;
  :
 z[9] = 10;
}

問題4. 複素数z1, z2がある.これらの和を計算する関数を作成せよ.引数は問題1で作った構造体を利用のこと.

解答例

Complex Cadd(Complex z1, Complex z2){
 Complex z;

 z.re = a.re + b.re;
 z.im = a.im + b.im;
 return z;
}

問題5. 複素数を z = x + j y で示したとき.オイラーの式 exp(jθ) = cosθ + j sinθ を用い,複素数の指数関数e(z)を求める関数を作成せよ.引数は問題1で作った構造体を利用すること.

解答例

Complex Cexp(Complex z) {
 Conplex zz;

 zz.re= exp(z.re) * cos(z.im);
 zz.im= exp(z.re) * sin(z.im);
 return zz;
}

以下でもよい
Complex Cexp(Complex z){
 Complex zz;
 zz.re = pow(exp(1), z.re) * cos(z.im);
 zz.im = pow(exp(1), z.im) * sin(z.im);
 return zz;
}

選択問題(問題6〜9の2問選択、それ以上は加点対象)

問題6. 補間とは何か説明せよ.A)何を知るために用いるのか,B)どのような処理を行うのか,C)注意すべきことは何かについて解答すること.

解答例

以下のような説明があればよい.
A) 有限個のデータの間にあるデータを推測するため
B) 線形補間であれば2点間を結ぶ直線の式を作り,それ以上の高次の場合はラグランジュやスプラインなど,点群間が相互に3次の曲線をなすという前提によって生成される式を生成する.
C) 生成される数式は必ず点群を通り,しかもアルゴリズムの違いによって必ずしも同一の曲線とはならない.

※計測データから理論式を見出すのが目的である場合は生成される曲線は理論式を反映したものである保証はなく,また点群のデータのいずれかにミスがあることを判断することはないので誤った曲線が生成される,などまで言及された場合,+1点とする.

問題7. フーリエ変換と離散フーリエ変換の違いについて説明せよ.対象とする信号の長さ,扱う周波数,および対象とする信号に関する前提条件について必ず説明すること.

解答例

以下のような説明があればよい.
フーリエ変換: 扱う信号の長さは時刻-∞〜∞の区間を対象とする.対象とできる周波数は0〜∞[Hz]であり,信号は連続量として扱うため,原理上は任意の信号で用いることができるが,計算機上では扱うことができない.
離散フーリエ変換: 扱う信号はサンプリングを行うことにより,有限個のデータ列となる.従って長さは時刻0〜サンプリング時間の区間を対象とする.対象とできる周波数は0〜サンプリング周波数の半分であり,信号は離散量として扱うため,計算機上で扱うことができる.

※サンプリング区間のデータが時刻-∞〜∞の区間で連続して繰り返されることに言及されている場合+1点とする.

問題8. 補間と最小二乗法の違いについて説明せよ.特に目的と演算結果の違いについて触れること.

解答例

以下のような説明があればよい.
補間の目的は,有限個のデータ点群を基にして,そのデータ以外の点を推定することである.演算結果は,データ点群を通過し,点群間を滑らかに(3次曲線など)結ぶ曲線となる.

最小2乗法の目的は,有限個のデータ点群を基にして対象とする関数(理論式など)の係数を同定することである.演算結果は同定される係数により生成される関数とデータ点群の各点との誤差が小さくなるようになる曲線であり,データ点群を通過するとは限らない.

※同定された関数との一致度合いにより,相関を算出することができ,測定データと理論式などの評価を行うことができることに言及されている場合+1点とする.

問題9. 力に関して[kgf]から[N]に換算したい.分割コンパイルを行うために以下のような3つのファイルを作成した.(1)〜(3)に何を書くべきか解答せよ.

解答例

ファイル:sub.h
#ifndef _SUB_H
#define _SUB_H

/*(1)以下に何を書くべきか?*/
double kgftoN(double);

#endif

ファイル:sub.c
#include <stdio.h>
#include "sub.h"

/*(2)以下に何を書くべきか?*/
double kgftoN(double force){
 return force*g;
}

ファイル:main.cpp
#include <stdio.h>
#include "sub.h"

int main()
{
 const double g = 9.80665;
 double kgf;
 double N;

 scanf("enter force value at [kgf] %lf", &kgf);

 /*(3)以下に何を書くべきか?*/
 N = kgftoN(kgf);

 printf("\n %f [kgf] -> %f [N]\n", kgf, N);
 return 0;
}

以上