java中怎么对函数求导_面向对象编程 —— java实现函数求导

首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地、科学地用java求出函数在一点的导数。

一、引子

defd(f) :defcalc(x) :

dx= 0.000001 #表示无穷小的Δx

return (f(x+dx) - f(x)) / dx #计算斜率。注意,此处引用了外层作用域的变量 f

return calc #此处用函数作为返回值(也就是函数 f 的导数)

# 计算二次函数 f(x) = x2 + x + 1的导数

f = lambda x : x**2 + x + 1 #先把二次函数用代码表达出来

f1 = d(f)#这个f1 就是 f 的一阶导数啦。注意,导数依然是个函数

# 计算x=3的斜率

f1(3)

# 二阶导数

f2 = d(f1)

首先,直接上一段python代码,请大家先分析下上面代码是用什么方法求导的。请不要被这段代码吓到,你无需纠结它的语法,只要明白它的求导思路。

博主说“如果不用 FP,改用 OOP,上述需求该如何实现?俺觉得吧,用 OOP 来求导,这代码写起来多半是又丑又臭。”

我将信将疑,于是就用面向对象的java试了试,最后也没多少代码。如果用java8或以后版本,代码更少。

请大家思考一个问题,如何用面向对象的思路改写这个程序。请先好好思考,尝试编个程序再继续往下看。

考虑到看到这个标题进来的同学大多是学过java的,下面我用java,用面向对象的思路一步步分析这个问题。

二、求导

文章开头我已近声明过了,本文不是来讨论数学的,求导只是我用来说明面向对象的一个例子。

如果你已经忘了开头那段代码的求导思路,请回头再看看,看看用python是如何求导的。

相信你只要听说过求导,肯定一眼就看出开头那段代码是用导数定义求导的。

64fd0a44985b720b43f369810430356f.png

代码中只是将无穷小Δx粗略地算做一个较小的值0.000001。

三、最初的想法

//自定义函数

public classFunction {//函数:f(x) = 3x^3 + 2x^2 + x + 1

public double f(doublex) {return 3 * x * x * x + 2 * x * x + x + 1;

}

}

//一元函数导函数

public classDerivedFunction {//表示无穷小的Δx

private static final double DELTA_X = 0.0000

你可能感兴趣的:(java中怎么对函数求导)