【Android】非线性方程的求解寻根

目录

前言:

一、Apache-commons-math3介绍

二、具体简单实例

2.1 导入函数类

2.2 定义函数接口

2.3 使用求解器

2.3.1 布伦特法(Brent)

2.3.2 米勒(Muller)法

2.3.3 Newton-Raphson法 


前言:

        最近在Android app实时显示数据上遇到了个问题,就是获取的数据需要进行转换。这里的转换公式为双指数函数,反函数不好转化出一个式子,需要实现非线性方程的求解寻根。

        以往完成这个操作,我是在matlab定义函数式用fslove求解来完成这件事情,我在思考是否可以在Android app上实现这一点。经过一些调研,的确是可以的,可以使用Apache-commons-math3来实现。

一、Apache-commons-math3介绍

        Apache-commons-math3是java的一种科学计算库,平日里接触数学计算更多是在matlab或者python上实现,在Android Java上实现的相关资料比较少。这里简要简要介绍一下apache-commons-math3,大致了解它能够做些什么,详细的使用可以去研究官方文档。

        math3可以支持的功能如下所示:

  • 支持常用的矩阵操作,例如矩阵转置、求逆以及加减乘除等
  • 支持矩阵分解操作,例如LU分解、QR分解、奇异值分解、特征值分解等
  • 可以实现一些数理统计的方法,例如t检验、卡方检验等等
  • 可以实现一些基本的数值方法,例如插值、曲线拟合、积分、最小二乘、线性回归等等
  • 可以实现非线性方程组的求解寻根。

        其中矩阵的运算是可以应用到多个场景,例如线性方程组求解、图像处理、信号处理以及机器学习和数据分析等;信号处理方面,常见的如傅里叶变换以及滤波处理;对于机器学习和数据分析,常见的特征矩阵被用于存储数据特征,线性代数中的运算方法常应用于模型训练和预测。

二、具体实例

        以上apache-commons-math3有很多的功能,这里我只讲述非线性方程组求解的实例。实现双指数单变量函数的求解寻根。

2.1 导入函数类

import org.apache.commons.math3.analysis.UnivariateFunction;   //单变量实数类
import org.apache.commons.math3.analysis.solvers.BrentSolver;   //布伦特法
import org.apache.commons.math3.analysis.solvers.MullerSolver;  //米勒(Muller)法
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure; //处理函数微分的类
import org.apache.commons.math3.analysis.solvers.NewtonRaphsonSolver;//Newton-Raphson法
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;//函数类
import org.apache.commons.math3.exception.DimensionMismatchException;

2.2 定义函数接口

        这里我们先进行初始化,这里是使用了单变量实函数类UnivariateFunction,对应方法布伦特法和米勒法。函数较为复杂,双指数函数:3323 * exp(-5.647 * x) + 239.2 * exp(-0.5883 * x) - data。注:data为实时获取的数据。

UnivariateFunction function = new UnivariateFunction() {
@Overridepublic double value(double x) {//data为实时获取的数据return (3323 * Math.exp(-5.647 * x) + 239.2 * Math.exp(-0.5883 * x) - data); }
};

2.3 使用求解器

        这里讲述一些我应用实践的求解器,求解函数方程的根。

2.3.1 布伦特法(Brent)

/*初始化求解器*/
/*布伦特法(混合寻根算法,结合了平方法、分割法和逆二次插值法)
* */
BrentSolver brentSolver = new BrentSolver(1e-9);/*求根*/
/*迭代次数、函数以及最小值和最大值*/
/*0.5ms*/
double res = brentSolver.solve(500,function,-5,8);

2.3.2 米勒(Muller)法

/*初始化求解器*/
/*米勒法*/
MullerSolver mullerSolver = new MullerSolver(1e-9);/*求根*/
/*迭代次数、函数以及最小值和最大值*/
double res = mullerSolver.solve(500,function,-10,10);

2.3.3 Newton-Raphson法 

//需要用到微分
//定义函数
UnivariateDifferentiableFunction function = new UnivariateDifferentiableFunction() {@Overridepublic DerivativeStructure value(DerivativeStructure t) throws DimensionMismatchException {double x = t.getValue();double result = (3323 * Math.exp(-5.647 * x) + 239.2 * Math.exp(-0.5883 * x) - data);//返回函数值以及一阶导数return new DerivativeStructure(1,1,0,result);}@Overridepublic double value(double x) {return (3323 * Math.exp(-5.647 * x) + 239.2 * Math.exp(-0.5883 * x) - resistence);}
};
NewtonRaphsonSolver newtonRaphsonSolver = new NewtonRaphsonSolver(1e-9);
//迭代次数、函数以及初始值
double res = newtonRaphsonSolver.solve(500,function,0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GitHub项目推荐--不错的 TypeScript 学习项目】【转载】

在线白板工具 Excalidraw 标星 33k,是一款非常轻量的在线白板工具,可以直接在浏览器打开,轻松绘制具有手绘风格的图形。 如下图所示,Excalidraw 支持最常用的图形元素:方框、圆、菱形、线,可以方便的使用…

CSS设置单行文字水平垂直居中的方法

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>单行文字水平垂直居中</title><style>div {/* 给div设置宽高 */width: 400px;height: 200px;margin: 100px auto;background-color: red;/…

Spark——Spark读写Greenplum/Greenplum-Spark Connector高速写Greenplum

文章目录 问题背景解决方式代码实现Spark写GreenplumSpark读Greenplum 参考 问题背景 通过数据平台上的DataX把Hive表数据同步至Greenplum&#xff08;因为DataX原生不支持Greenplum Writer&#xff0c;只能采用PostgreSQL驱动的方式&#xff09;&#xff0c;但是同步速度太慢…

Mybatis的XML配置

MyBatis 是一个持久层框架&#xff0c;通过 XML 配置文件来定义 SQL 映射和结果的映射规则。以下是关于 MyBatis XML 配置文件的详细说明&#xff1a; 基本结构&#xff1a; XML 配置文件通常包含 <mapper>、<resultMap>、<typeAliases> 等元素。 2. mappe…

NoSQL基本内容

第一章 NoSQL 1.1 什么是NoSQL NoSQL&#xff08;Not Only SQL&#xff09;即不仅仅是SQL&#xff0c;泛指非关系型的数据库&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;…

(免费领源码)java#Springboot#mysql旅游景点订票系统68524-计算机毕业设计项目选题推荐

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

网络安全02--负载均衡下的webshell连接

目录 一、环境准备 1.1ubentu虚拟机一台&#xff0c;docker环境&#xff0c;蚁剑 1.2环境压缩包&#xff08;文件已上传资源&#xff09;&#xff1a; 二、开始复原 2.1上传ubentu&#xff1a; 2.2解压缩 2.3版本20没有docker-compose手动下载&#xff0c;包已上传资源 …

人类基因组计划发现的8大真相

人类基因组计划是科学史上重要的里程碑事情。该计划的成功&#xff0c;不仅开启了人类了解自身的旅程&#xff0c;而且成为了国际科技合作的典范。对于人类基因组&#xff0c;发现了以下 8 个事实。 1. 人类基因组约有 20300 个蛋白质编码基因。这与最初预估的 30000 ~ 40000 个…

pytest教程-7-用例前后置方法

上一小节&#xff0c;我们学习了pytest跳过测试用例的方法&#xff0c;本小节我们讲解一下pytest用例的前后置方法。 在unittest中就有前置setup和后置teardown来处理测试用例执行前的准备工作&#xff08;浏览器驱动实例化&#xff0c;数据库连接等&#xff09;以及执行后的处…

JS之隐式转换与布尔判定

大家思考一下 [ ] [ ] &#xff1f; 答案是空字符串 为什么呢&#xff1f; 当做加法运算的时候&#xff0c;发现左右两端存在非原始类型&#xff0c;也就是引用类型对象&#xff0c;就会对对象做隐式类型转换 如何执行的&#xff1f;或者说怎么查找的&#xff1f; 第一步&…

IntelliJ IDE 插件开发 | (五)VFS 与编辑器

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

【GitHub项目推荐--不错的 React 开源项目】【转载】

用 React Flow 连接你的想法 用 React Flow 连接你的想法&#xff0c;这是一个高度可定制的库&#xff0c;基于 React 用于构建基于节点的 交互式 UI、编辑器、流程图和图表。 开源地址&#xff1a;https://github.com/wbkd/react-flow Bulletproof React 一个简单、可扩展且…

Xmind安装到指定目录

Xmind安装到指定目录 默认情况下安装包自动引导安装在C盘&#xff08;注册表默认位置&#xff09; T1:修改注册表&#xff0c;比较麻烦 T2:安装时命令行指定安装位置&#xff0c;快捷省事 1&#xff09;下载安装包&#xff08;exe可执行文件&#xff09; 2&#xff09;安装…

PyTorch深度学习实战(33)——条件生成对抗网络(Conditional Generative Adversarial Network, CGAN)

PyTorch深度学习实战&#xff08;33&#xff09;——条件生成对抗网络 0. 前言1. 条件生成对抗网络1.1 模型介绍1.2 模型与数据集分析 2. 实现条件生成对抗网络小结系列链接 0. 前言 条件生成对抗网络 (Conditional Generative Adversarial Network, CGAN) 是一种生成对抗网络…

IP报文格式(全网最详细)

IP报文格式 报文格式 图1 IP头格式 表1 IP头字段解释 字段长度含义Version4比特 4&#xff1a;表示为IPV4&#xff1b;6&#xff1a;表示为IPV6。IHL4比特首部长度&#xff0c;如果不带Option字段&#xff0c;则为20&#xff0c;最长为60&#xff0c;该值限制了记录路由选项。…

AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration)

AutoGen是微软推出的一个全新工具&#xff0c;它用来帮助开发者创建基于大语言模型(LLM)的复杂应用程序. AutoGen能让LLM在复杂工作流程启用多个角色代理来共同协作完成人类提出的任务。在我之前的一篇博客: AutoGen实战应用(一)&#xff1a;代码生成、执行和调试 中我们通过一…

Linux如何配置磁盘(自动)挂载?

一些用户喜欢把开机自启动的命令&#xff08;包含磁盘挂载&#xff09;放在/etc/rc.local中。但是由于rc.local中的内容是顺序执行的&#xff0c;一些执行异常、文件权限、环境变量等问题&#xff0c;都可能导致rc.local中的命令没办法开机自启动&#xff0c;所以在磁盘挂载的开…

【RabbitMQ】交换机的概念及使用

一、引言 1、什么是交换机 RabbitMQ中&#xff0c;交换机是一个核心概念&#xff0c;主要用来将生产者生产出来的消息&#xff0c;传送到对应的队列中。实际上&#xff0c;生产者生产的消息从不会直接发送到队列&#xff0c;而是发送到交换机。交换机一方面接收来自生产者的消…

SpringBoot项目配置SSL后,WebSocket连接失败的解决方案

SpringBoot项目配置SSL后&#xff0c;WebSocket连接应使用wss协议&#xff0c;而不是ws协议。在前端配置WebSocket时&#xff0c;URL以wss://开头。

嵌入式学习第十二天

8.数组指针和指针数组&#xff08;2&#xff09;: &#xff08;1&#xff09;指针数组&#xff1a; int *a[5]; char *str[5]; 指针数组主要用来操作字符串数组,通过将指针数组的每个元素存放字符串的首地址实现对多个字符串的操作 二维数组主要用来存储字符串数组…