微分は引き算ってことがわかりやすくなるようなプログラムを考えてみる。
微分というのは、関数の傾きを求める操作です。
で、これを式として求めるときの規則として簡単なものに次のようなものがあります。
例えば次のような式を微分します。
そうすると、こうなります。xの0乗は1なので、最後の項からはxがなくなってます。
微分の定義としては、つぎのようになります。
これは、Δを無限に0に近づけたときのということになるのですが、プログラムで計算するときは無限に0に近づけるということはできないので、ほどほどに小さい値を使います。こういった求め方を差分といいます。
ここでは、式として求めた理論的な値と、差分の値がどんだけ違うか比べてみます。
メソッドfが目的の関数、dfが理論的な微分式で、それと並べてを表示しています。
見た目、理論値と差分の値はほとんど変わりません。
精度が欲しいときにはを使うこともあります。
import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; public class Differentiation { //目的の関数 private static double f(double x){ return 10 * x * x * x - 3 * x * x - x; } //微分の理論値 private static double df(double x){ return 30 * x * x - 6 * x - 1; } 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) = 10 x^3 - 3 x^2 - x", 10, 20); g.drawString("理論値 f'(x) = 30 x^2 - 6 x - 1", 10, 160); g.drawString("差分 (f(x + dx) - f(x)) / dx", 10, 260); double dx = .01; for(int i = 0; i < 300; ++i){ double x = (i - 150) * 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); } }