微分での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); } }