sin(x)如何求解的java代码实现方法

作者:八斗五车 时间:2022-04-17 16:22:07 

1 泰勒级数介绍

近期工作中需要使用matlab建模,期间做案例的时候有个方程:sin(x)=0,要求不使用现有api进行求解,然后有点懵,不知道如何下手,最后翻了很多资料终于有点头绪。有了java的解题思路,再把思路转变为stateflow就简单了。

在数学中,泰勒级数用无限项连加式——级数来表示一个函数,这些相加的项由函数在某一点的导数求得。泰勒级数是以于1715年发表了泰勒公式的英国数学家布鲁克·泰勒的名字来命名的。通过函数在自变量零点的导数求得的泰勒级数又叫做麦克劳林级数,以苏格兰数学家科林·麦克劳林的名字命名。 泰勒级数在近似计算中有重要作用。

定理

以下图截取自百度百科。

sin(x)如何求解的java代码实现方法

泰勒级数的重要性体现在以下三个方面:

  • 幂级数的求导和积分可以逐项进行,因此求和函数相对比较容易。

  •  一个解析函数可被延伸为一个定义在复平面上的一个开区域上的泰勒级数通过解析延拓得到的函数,并使得复分析这种手法可行。 

  • 泰勒级数可以用来近似计算函数的值。

2 sin(x)泰勒级数变换求解

2.1 将sin(x)展开成泰勒级数的形式

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

2.2 定义变量

double x0 = 1.0; // 初始值
double error = 1.0; // 误差值
double tolerance = 1e-6; // 精度值
int n = 1; // 迭代次数

2.3  循环计算误差值

使用迭代公式不断逼近解,直到误差值小于精度值为止

while (error > tolerance) {
   double term = x0; // 泰勒级数的第一项
   double x = x0; // 迭代得到的新的x值
   for (int i = 1; i <= 2*n+1; i++) {
       term *= -x0*x0/(i*(i+1)); // 计算泰勒级数的下一项
       x += term; // 累加泰勒级数的各项
   }
   error = Math.abs(x - x0); // 计算误差值
   x0 = x; // 更新x0的值
   n++; // 迭代次数加1
}

2.4 完整java代码实现

public class Main {
   public static void main(String[] args) {
       double x0 = 1.0; // 初始值
       double error = 1.0; // 误差值
       double tolerance = 1e-6; // 精度值
       int n = 1; // 迭代次数
       while (error > tolerance) {
           double term = x0; // 泰勒级数的第一项
           double x = x0; // 迭代得到的新的x值
           for (int i = 1; i <= 2*n+1; i++) {
               term *= -x0*x0/(i*(i+1)); // 计算泰勒级数的下一项
               x += term; // 累加泰勒级数的各项
           }
           error = Math.abs(x - x0); // 计算误差值
           x0 = x; // 更新x0的值
           n++; // 迭代次数加1
       }
       System.out.println("sin(x) = 0 的一个解为 x = " + x0);
   }
}

运行结果:

sin(x) = 0 的一个解为 x = 3.141592653589793

3 总结

说实话,做了这么多年的开发,没有去注重这些实现,都是直接使用api。真正哪天需要从基础开始实现的时候,真的一头雾水。

这几天学了matlab,才知道自己知识多么薄弱,往后需要大补啊。

来源:https://juejin.cn/post/7225803154553651257

标签:java,sin(x),求解
0
投稿

猜你喜欢

  • 解析spring加载bean流程的方法

    2023-11-29 13:50:32
  • Flutter 剪裁组件的使用

    2023-06-18 13:15:04
  • Spring源码解析之编程式事务

    2023-06-20 19:17:49
  • Spring @Profile注解详解

    2023-04-20 06:26:16
  • Spring Boot+Drools规则引擎整合详解

    2023-11-28 20:33:00
  • java代码执行字符串中的逻辑运算方法

    2023-11-29 12:13:06
  • Java monitor机制使用方法解析

    2023-11-09 11:25:56
  • iOS应用中使用Toolbar工具栏方式切换视图的方法详解

    2023-06-21 09:24:48
  • java字符串相似度算法

    2023-11-26 12:33:25
  • SpringBoot使用Sharding-JDBC实现数据分片和读写分离的方法

    2023-07-27 02:15:50
  • Java Map接口及其实现类原理解析

    2022-06-04 22:54:29
  • Java 调用天气Webservice详解及实例代码

    2021-10-09 21:59:03
  • 使用Jenkins来构建SVN+Maven项目的实现

    2023-07-30 12:45:22
  • Java 守护线程_动力节点Java学院整理

    2023-11-28 07:51:14
  • C语言文件操作函数大全(超详细)

    2023-07-15 06:20:42
  • 详解Servlet3.0新特性(从注解配置到websocket编程)

    2023-08-08 14:29:48
  • Java新特性之Nashorn_动力节点Java学院整理

    2022-07-31 17:18:13
  • JAVA遍历Map集合的几种方法汇总

    2021-09-01 12:34:07
  • maven的pom.xml中profiles的作用详解

    2022-07-03 20:40:54
  • springboot中.yml文件参数的读取方式

    2021-06-20 00:57:51
  • asp之家 软件编程 m.aspxhome.com