微分でのsinとcosの関係

微分でのsinとcosの関係がわかるようなプログラムを考えてみる


sinは微分するとcosに、cosは微分すると-sinになります。

f 微分
sin cos
cos -sin


で、これがどういうことかと。
sinは、0から始まって、だんだん増えていきます。で、その増え方はだんだん減っていきます。つまり、最初の点を微分したら+の値になって、その後は徐々に減ります。cosは1から始まって徐々に減るので、これがあてはまります。
一方、cosは1から始まって、最初は一定。で、徐々に減ります。つまり、最初の点を微分したら0になって、その後マイナスになります。sinは0から始まって徐々に増えるので、そのままではあてはまらず、マイナス符号をつけると当てはまります。


ということで、sin、cosの微分の関係は、グラフの形でわかるようになったほうがいいですよ、と。

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Differentiation {
    //目的の関数
    private static double f(double x){
        return Math.sin(x) * 30;
    }
    //微分の理論値
    private static double df(double x){
        return Math.cos(x) * 30;
    }
    
    public static void main(String[] args){
        Image img = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) img.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 400, 300);
        g.setColor(Color.BLACK);
        g.drawString("目的関数 f(x) = 30 sin x", 15, 15);
        g.drawString("理論値   f'(x) = 30 cos x", 15, 115);
        g.drawString("差分     (f(x + dx) - f(x)) / dx", 15, 215);
        g.drawLine(10, 50, 310, 50);
        g.drawLine(10, 150, 310, 150);
        g.drawLine(10, 250, 310, 250);
        g.drawLine(10, 20, 10, 280);
        double dx = .02;//刻み幅をちょっと荒くした
        for(int i = 0; i < 300; ++i){
            double x = i * dx;
            //目的関数
            g.fillRect(i + 10, (int)(50 -  f(x)),                      2, 2);
            //微分の理論値
            g.fillRect(i + 10, (int)(150 - df(x)),                     2, 2);
            //差分
            g.fillRect(i + 10, (int)(250 - ((f(x + dx) - f(x)) / dx)), 2, 2);
        }
        g.dispose();
        
        JFrame f = new JFrame("微分");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400, 350);
        f.add(new JLabel(new ImageIcon(img)));
        f.setVisible(true);
    }
}