見出し画像

高校数学10分プログラミング(数学Ⅱ編 5.微分法と積分法)2日目「接線を描く」

マガジンリスト > 数学Ⅱ編 5.微分法と積分法 > 2日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学II編 5.微分法と積分法)の2日目です。

本日の課題は、接線を描くプログラムを作成することです。


接線

まず、接線について解説しておきます。

接線

曲線$${y = f(x)}$$上の点$${\mathrm{A} (a, f(a))}$$における接線
① 接線の傾き$${m}$$ $${m=f'(a)}$$
② 接線の方程式 $${y-f(a) = f'(a)(x-a)}$$

法線

曲線上の点$${\mathrm{A}}$$を通り、$${\mathrm{A}}$$における接線に垂直な直線のことをいう。
曲線$${y = f(x)}$$上の点$${\mathrm{A} (a, f(a))}$$における法線の方程式は、

$$
f'(a) \neq 0 \mathrm{のとき} y-f(a) = -\frac{1}{f'(a)} (x-a)
$$

$$
f'(a) = 0 \mathrm{のとき} x = a
$$

図1 曲線上の点の接線と法線


課題

曲線$${ y=x^2-3x+2 }$$上の点$${(1,0)}$$における、曲線の接点を緑色でプロットし、曲線の接線のグラフを赤色、法線のグラフを青色でそれぞれ描くプログラムを作成してください。


ヒント

プログラム

キャンバス上に座標軸を描く関数 setAxes を利用して課題の曲線や接線、法線を描くスケッチ「drawTangentialLine」を準備しました。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。

展開または解凍して得られるスケッチ「drawTangentialLine」の中のpdeファイル「drawTangentialLine.pde」をダブルクリックしてスケッチ「drawTangentialLine」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawTangentialLine」タブを選択すると、そのテキストエリアに以下のソースコードが書かれています。

float x_range = 10.0; // x軸の表示範囲 -x_rangeからx_rangeまで
float y_range = 10.0; // y軸の表示範囲 -y_rangeからy_rangeまで 

void setup(){
  size(500,500);
  noLoop();

  setAxes(x_range, y_range); // 座標軸の準備
  
  noFill();
  
  // 曲線を描く
  stroke(0,0,0);  
  float x_min = -x_range;
  float x_max = x_range;
  draw_curve_function(x_min, x_max);

  // 接点をプロットする
  float a = 1.0; // 接点のx座標
  stroke(0,255,0);
  plot_contact_point(a);

  // 接線を描く
  stroke(255,0,0);
  draw_tangential_line(a, x_min, x_max);

  // 法線を描く
  stroke(0,0,255);
  draw_normal_line(a, x_min, x_max);

}

// 曲線を表す関数
float f(
  float x 
){
  return x*x-3.0*x+2.0;
}

// 曲線の導関数
float f_prime(
  float x
){
  return 
}

// 曲線を描く関数
void draw_curve_function(
  float x_min, // グラフの定義域の下限
  float x_max  // グラフの定義域の上限
){
  int plot_num = 2000; // グラフを描くための頂点の個数  
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標 
  beginShape();
  for(int i=1; i<plot_num; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 曲線上の点のx座標
    y = f(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

// 接点をプロットする関数
void plot_contact_point(
  float a // 接点のx座標
){
  float y =  // 接点のy座標 
  float X, Y; // キャンバス上の座標
  // キャンバス上の座標位置に換算
  X = width / 2.0 / x_range * a;
  Y = height / 2.0 / y_range * y;
  strokeWeight(5);
  point(X, Y);
  strokeWeight(1);
}

// 接線を描く関数
void draw_tangential_line(
  float a, // 接点のx座標
  float x_min, // グラフの定義域の下限
  float x_max  // グラフの定義域の上限
){
  int plot_num = 2000; // グラフを描くための頂点の個数  
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標 
  beginShape();
  for(int i=1; i<plot_num; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 接線上の点のx座標
    y =  // 接線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();
}

// 法線を描く関数
void draw_normal_line(
  float a, // 接点のx座標
  float x_min, // グラフの定義域の下限
  float x_max  // グラフの定義域の上限
){  
  int plot_num = 2000; // グラフを描くための頂点の個数  
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標

  if( f_prime(a) == 0.0 ){
    X = width / 2.0 / x_range * a;
    line(X, -height/2.0, X, height/2.0);
  } else {
    beginShape();
    for(int i=1; i<plot_num; i++){
      x = x_min + (x_max - x_min) / plot_num * i; // 接線上の点のx座標
      y =  // 接線上の点のyの値
      // キャンバス上の座標位置に換算
      X = width / 2.0 / x_range * x;
      Y = height / 2.0 / y_range * y;
      vertex(X, Y);
    }
    endShape();
  }
}

ソースコード1 曲線上の点における接線と法線とを描くプログラム(未完成)

ソースコード1では、元の関数$${f(x)}$$を関数 f 、$${f(x)}$$の導関数を f_prime 関数とし、曲線を描く関数 draw_curve_function 、接点をプロットする関数 plot_contact_point 、接線を描く関数 draw_tangential_line 、法線を描く関数 draw_normal_line としてそれぞれ準備し、setup 関数内でこれらの関数を呼び出すことで元の曲線のグラフ、接点、接線のグラフ、法線のグラフを描くようにしています。
ただし、4つの関数 f_prime 、plot_contact_point 、draw_tangential_line 、draw_normal_line は返り値や$${y}$$座標の値などをまだ記載していません。上記の接線の節の内容を参考に、返り値や$${y}$$座標の値などを追記してプログラムを完成させてください。


それでは、よろしくお願いします。

MK's papa


いいなと思ったら応援しよう!