R语言求根
求根是数值计算的一个基本问题,一般采用的都是迭代算法求解,主要有不动点迭代法、牛顿-拉富生算法、割线法和二分法。
- 不动点迭代法
所谓的不动点是指x=f(x)的那些点,而所谓的不懂点迭代法是指将原方程化为x=f(x)形式之后,下一步所用的x值为这一步的f(x),这样的话就可以一直逼近我们需 要的x,即方程的根,但是这种方法可能不会收敛到方程的根,随着初始值选定的大小,可能会有发散的情况,因此需要谨慎使用。
###不动点迭代法
func1 <- function(x){return(exp(exp(-x)))}
fixpoint <- function(func, x0, tol=1e-8, max.iter=1e4){
###求根的函数func
###初始值x0
###允许误差范围tol
###最大循环次数max.iter
x.old <- x0
x.new <- x0
for(i in 1:max.iter){
x.new <- func1(x.old)
if(abs(x.new - x.old) < tol && i<max.iter){
cat('the iter time is',i,'\n')
return(format(x.new,digits = 9))
}
x.old <- x.new
}
cat('bad start num')
}
- 牛顿-拉富生算法
所谓的牛顿-拉富生算法其实就是课本里面说的牛顿迭代法,也不是一个难的程序,主要思想就是x(n+1)=x(n)-f(x(n))/f`(x(n)),因此这种方法需要有求导表达式,限制了使用范围。
###牛顿迭代法
###示例方程
func1 <- function(x){return(log(x)-exp(-x))}
func2 <- function(x){return(1/x+exp(-x))}
Newton <- function(func1, func2, x0, tol=1e-8, max.iter=1e4){
###牛顿迭代法//
###输入方程式func1
###输入func1的导函数func2
###初始值x0
###误差范围tol
###最大迭代次数
x <- x0
for(i in 1:max.iter){
x <- x - func1(x)/func2(x)
if(abs(x0-x) < tol){
cat('iter num is:',i,'\n')
return(x)
}
x0 <- x
}
cat('this is a not good start num or the function is bad!')
}
- 割线法
使用牛顿法的时候 ,需要先得到函数的导函数,但是很多时候都没有导函数的解析表达式,因此可以考虑一种替代导函数的近似,即割线法,使用了一段直线作为函数某一段的近似,具体的数学表达式推导很简单,在此略过,其主要假设是所求点的y值恰好为0,我是用相似比解出来的。
###割线法
###割线法公式:x(n+1)=[f(xn)x(n-1) - x(n)f(x(n-1))] / [f(xn) - f(x(n-1))]
###示例函数
func1 <- function(x){return(log(x)-exp(-x))}
gexian <- function(func,x0,x1,tol=1e-8,max.iter=1e4){
###割线法需要两个初始值
for(i in 1:max.iter){
x <- (func(x1)*x0 - x1*func(x0)) / (func(x1) - func(x0))
if(abs(x-x1) < tol){
cat('iter num is:',i,'\n')
return(x)
}
x0 <- x1
x1 <- x
}
cat('this is a not good start num or the function is bad!')
}
- 二分法
上述的方法均有可能不收敛,并且对函数会有一些额外的要求,一种比较暴力的方法但是适用范围更广的解决办法就是二分法,其思想是如果f(x)连续,那么就一定会存在f(x1)<0,f(x2)>0的情况,根必然在x1和x2之间,之后只要不断逼近根就好了。
###二分法
func1 <- function(x){return(log(x)-exp(-x))}
half_M <- function(func,x0,x1,tol=1e-8,max.iter=1e4){
###初始x0,x1必须满足f(x0)f(x1) < 0,x0 < x1
for(i in 1:max.iter){
cat(x0," ",x1,"\n")
if(abs(x0-x1) < tol){
cat('iter num:',i,"\n")
return(x0)
}
temp_x <- (x0 + x1)/2
if((func(temp_x)*func(x0)) < 0){
x1 <- temp_x
}
else{
x0 <- temp_x
}
}
}
R语言求根的更多相关文章
- 说说用C语言求根的那些事儿
C语言--求根:计算机只识别0和1,那么问题来了,作为计算工具如何解决数学问题?其实,计算机是死东西,都是程序员用计算机的的思维去加数学公式计算数学题的.听起来好高端的样子,其实啊,也就那么回事儿, ...
- 用R语言求置信区间
用R语言求置信区间 用R语言求置信区间是很方便的,而且很灵活,至少我觉得比spss好多了. 如果你要求的只是95%的置信度的话,那么用一个很简单的命令就可以实现了 首先,输入da=c(你的数据,用英文 ...
- R语言两种方式求指定日期所在月的天数
R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...
- R 语言实现求导
前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽脑汁,但始终都不知道为何而学.生活和工作基本用不到,就算是在计算机行业和金融行业,能 ...
- YTU 2405: C语言习题 牛顿迭代法求根
2405: C语言习题 牛顿迭代法求根 时间限制: 1 Sec 内存限制: 128 MB 提交: 562 解决: 317 题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b ...
- C语言复习---迭代法,牛顿迭代法,二分法求根
一:用迭代法求 x=√a.求平方根的迭代公式为:X(n+1)=(Xn+a/Xn) /2. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> ...
- R语言进阶
一.初学入门:<R in Action><The Art of_R Programming>入门者可首选两本,前者从统计角度入手,分高中低三部分由浅入深的讲解了如何用R来实现统 ...
- 数据分析与R语言
数据结构 创建向量和矩阵 函数c(), length(), mode(), rbind(), cbind() 求平均值,和,连乘,最值,方差,标准差 函数mean(), sum(), min(), m ...
- R语言︱基本函数、统计量、常用操作函数
先言:R语言常用界面操作 帮助:help(nnet) = ?nnet =??nnet 清除命令框中所有显示内容:Ctrl+L 清除R空间中内存变量:rm(list=ls()).gc() 获取或者设置当 ...
随机推荐
- vector内存回收
1. vector所有的内存相关问题都可以归结于它的内存增长策略.vector有一个特点就是:内存空间只会增长不会减少.vector有两个函数,一个是capacity(),返回对象缓冲区(vector ...
- sql取整数
[四舍五入取整]select round(1.1,0) 执行结果为1: [向下取整]select floor(1.1) 执行结果为2: [向上取整] select ceiling(1.1) 执行结果为 ...
- cuda cudnn tensorflow-gpu安装
Ububtu18.04下载cuda9.0 下载好后得到: CUDA 9.0仅支持GCC 6.0及以下版本,而Ubuntu 18.04预装GCC版本为7.3,需要安装gcc-6与g++-6 查看当前版本 ...
- jQuery初识、函数、对象
初识jQuery 官方地址:http://jquery.com/ what:一个优秀的JS函数库(封装了BOM.DOM(主要)) why: HTML元素选取(选择器) HTML元素操作 CSS操作 H ...
- LaTex Verbatim 环境下使用数学符号
参考: Write math and make a box with alltt environment LaTex Verbatim 环境下使用数学符号 在 Verbatim 环境下使用数学符号,需 ...
- PHP 获取当前访问的完整URL
代码如下: <?php // php 获取当前访问的完整url function GetCurUrl() { $url = 'http://'; if(isset($_SERVER['HTTPS ...
- Vue-admin工作整理(一):项目搭建
1.首先要安装vue-cli 3.0以上版本,和git 该版本可以支持页面化快速创建: sudo npm install -g @vue/cli 安装完毕后查看vue版本信息:vue -V 2.安装好 ...
- LeetCode--029--两数相除(java)
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- 从身份证管理系统思考企业CMDB的建设
关注嘉为科技,获取运维新知 对大部分中大型的企业来说,CMDB建设对于整个IT服务和IT运维管理的重要性不言而喻,但是目前仍然有非常多的企业无法建设好CMDB. 我最近刚好接触了一个公安系统的朋友,他 ...
- hdoj3138
题意:略 各点向原信念连INF+1的边,不同信念连INF的边,这样割原信念花费大一点.然后好友连1的边.最小割的结果-n*INF就是答案,因为割到哪边最少都要INF. #include <ios ...