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

本文通过示例代码展示了如何使用Java进行函数求导,探讨了面向对象编程(OOP)和函数式编程(FP)在解决这个问题上的应用。作者通过不断改进代码,最终实现了用OOP优雅地求导,并指出Java同样可以简洁地处理这种问题,挑战了‘OOP求导丑陋’的观点。
摘要由CSDN通过智能技术生成

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

一、引子1

2

3

4

5

6

7

8

9

10

11

12def (f) :

def calc(x) :

dx = 0.000001

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是如何求导的。

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

8b17be86a37dcc0117a8fc0fc7b720f4.png

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

三、最初的想法1

2

3

4

5

6

7//自定义函数

public class Function{

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

public double f(double x){

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Java计算器,可以计算多项式和它的导数: ```java import java.util.Scanner; public class Calculator { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入多项式的次:"); int n = input.nextInt(); double[] a = new double[n+1]; System.out.println("请输入多项式的系:"); for(int i=0; i<=n; i++) { a[i] = input.nextDouble(); } System.out.print("请输入自变量x的值:"); double x = input.nextDouble(); double result = evaluate(a, x); double derivative = evaluate(derivative(a), x); System.out.println("多项式的值为:" + result); System.out.println("多项式的导数为:" + derivative); } // 计算多项式f(x)在x处的值 public static double evaluate(double[] a, double x) { double result = 0; for(int i=0; i<a.length; i++) { result += a[i] * Math.pow(x, i); } return result; } // 计算多项式f(x)的导数 public static double[] derivative(double[] a) { double[] result = new double[a.length-1]; for(int i=1; i<a.length; i++) { result[i-1] = a[i] * i; } return result; } } ``` 在上面的代码中,我们首先读入多项式的次和系,然后读入自变量x的值。接着,我们调用`evaluate`函数计算多项式的值和`derivative`函数计算多项式的导数。最后,我们输出结果。 `evaluate`函数采用了一个简单的循环来计算多项式的值。我们首先初始化结果为0,然后遍历系组,并累加每个系乘以自变量的幂次方的结果。 `derivative`函数也采用了一个简单的循环来计算多项式的导数。我们首先初始化结果组为0,然后遍历系组,并将每个系乘以其对应的幂次方的结果存入结果组中。注意,导数的次比原多项式的次要少1。 这个计算器可以计算任意次的多项式和它的导数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值