Secant 方法介绍

Secant Method

函数 Secant_Methods 简介

1.函数定义

[c, errColumn] = Secant_Method(f, a, b, N, convergence_type, tolerance)

2.输入

%   f - function handle
% a - start position of interval bracket
% b - end position of interval bracket
% N [optional] - max iteration number
% convergence_type [optional] - [= 1] absolute error tolerances
% [= 0] relative error tolerances
% tolerance [optional] - [convergence_type = 1] absolute error tolerances
% [convergence_type = 0] relative error tolerances
%

3.输出

%   c - approximation of root r ( f(r) = 0 )
% errColumn - the absolute/relative errors during the progress
% convergence_step - the number of steps taken, if the method doesn't
% convergence, [convergence_step = inf]

注意,errColumn 长度为 N,若在第k步收敛解后,剩余元素都与收敛步误差相同

4.代码

function [c, errColumn, convergence_step] = Secant_Method(f, a, b, N, convergence_type, tolerance)
% Use Secant Method to find roots of equation [f(x) = 0]
%
% Input:
% f - function handle
% a - start position of interval bracket
% b - end position of interval bracket
% N [optional] - max iteration number (default value: 10)
% convergence_type [optional] - [= 1] absolute error tolerances (default)
% [= 0] relative error tolerances
% tolerance [optional] - [convergence_type = 1] absolute error tolerances
% [convergence_type = 0] relative error tolerances
%
% Output:
% c - approximation of root r ( f(r) = 0 )
% errColumn - the absolute/relative errors during the progress
% convergence_step - the number of steps taken, if the method doesn't
% convergence, [convergence_step = inf]
% Usages:
%
% 1. use default value
% f = @(x) x^2 - 1
% c = false_position(f, 0, 2)
%
% 2. user set value
% c = false_position(f, 0, 2, 20, 0, 1e-5)
%
% Warnning:
% 1. if f(a) and f(b) have the same sign, the function returns an Nan.
% 2. if the false position lines outside the bracket interval, the
% function will throws an error.
% 3. After N times iteration, if the method does not converge, an message
% will be printed on the command window and return the current vaule. %% check input parameters % check the interval is really a bracket
if (a > b)
error('please check the bracket!');
end % check that that neither end-point is a root
% if f(a) and f(b) have the same sign, throw an Nan.
if( f(a) == 0 )
c = a;
return;
elseif ( f(b) == 0 )
c = b;
return;
elseif ( f(a) * f(b) > 0 )
c = Nan;
return;
end % check max iteration number exits
% default value is 10
if ~exist('N', 'var')
N = 10;
end% if % check choice of error tolerances
% default value is 1
if ~exist('convergence_type', 'var')
convergence_type = 1;
tolerance = 1e-6;
end% if % check the tolerances is positive
if tolerance <= 0
error('the tolerances should be positive!');
end % relative error tolerances
errColumn = zeros(N, 1); %% iteration
% iterate at most N times c_old = a;
convergence_step = inf; for k = 1:N
%% find the false position
% c = (a*f(b) + b*f(a))/(f(b) - f(a));
c = ( b*f(a) - a*f(b) )/(f(a) - f(b)); % check c lies within the bracketing interval
if (c < a) || (c > b)
error('convergence problem occurs! please reset bracket interval.')
end %% reset bracketing interval
% Check if c is a root
if ( f(c) == 0 )
% return c
return;
elseif ( f(c)*f(a) < 0 )
% if f(a) and f(c) have opposite signs
% set [a, c] as the new bracketing interval
b = c;
else
% if f(b) and f(c) have opposite signs
% set [c, b] as the new bracketing interval
a = c;
end %% cal the absolute/relative errors
switch convergence_type
case 0 % relative error
errColumn(k) = abs( (c - c_old)/c_old );
if errColumn(k) < tolerance
convergence_step = k;
errColumn(k:end) = errColumn(k);
% set convergence step
% set the remaining step errors
return;
end
case 1 % absolute error
errColumn(k) = abs( f(c) );
if errColumn(k) < tolerance
% set convergence step
% set the remaining step errors
convergence_step = k;
errColumn(k:end) = errColumn(k);
return;
end
end% switch c_old = c;
end fprintf( 'the method did not converge\n\n' );
end

算例 Q1.m

find all roots of \(1000000x^3 − 111000x^2 + 1110x = 1\)

  • 绘制函数函数图像,寻找方程根所在区间

  • 选取区间

    选取3个区间分别为 \([-0.01, 0.005], [0.005, 0.06], [0.06, 0.11]\)。

  • 计算

    第一个区间 \([-0.01, 0.005]\) 为例,选择绝对误差为 \(10^{-6}\),迭代40次。得到误差随迭代次数变化关系为



    其中红色点代表第31步方法收敛位置。

  • 结果

    最终得到方程三个根为

r =

    0.0010
0.0100
0.1000
  • 脚本
%% Q1
f = @(x) 1000000*x.^3 - 111000*x.^2 + 1110*x - 1; % plot function
x = linspace(-0.01, 0.11, 50);
y = f(x);
figure; plot(x,y); grid on; % set interval bracket
a(1) = -0.01; a(2) = 0.005; a(3) = 0.06; a(4) = 0.11; % cal roots in a loop
r = zeros(3,1); for ib = 1:3
[r(ib), errColumn, con_step] = Secant_Method(f, a(ib), a(ib+1), 40); if ib == 1
figure; plot(errColumn); hold on;
plot(con_step, errColumn(con_step), 'ro');
xlabel('Method Steps'); ylabel('Absolute Error')
end% if
end% for

Secant 方法求方程多个根的更多相关文章

  1. OpenJudge计算概论-求一元二次方程的根【含复数根的计算、浮点数与0的大小比较】

    /*====================================================================== 求一元二次方程的根 总时间限制: 1000ms 内存限 ...

  2. 计算概论(A)/基础编程练习1(8题)/4:求一元二次方程的根

    #include<stdio.h> #include<math.h> int main() { // 待解方程数目 int n; scanf("%d", & ...

  3. 求方程x1+x2+x3=15的整数解的数目

    求方程x1+x2+x3=15的整数解的数目要求0≤x1≤5,0≤x2≤6,0≤x3≤7.解:令N为全体非负整数解(x1,x2,x3),A1为其中x1≥6的解:y1=x1-6≥0的解:A2为其中x2≥7 ...

  4. 【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。

    第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归 ...

  5. poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)

    poj3660 题意: 有n头牛, 给你m对关系(a, b)表示牛a能打败牛b, 求在给出的这些关系下, 能确定多少牛的排名. 分析: 在这呢先说一下关系闭包: 关系闭包有三种: 自反闭包(r), 对 ...

  6. 给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 <把一个整数各个数位进行全排列>

    """给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 -> 把一个整数各个数位进行全排列""" # 使用 permu ...

  7. hdu 2545 求当前结点到根节点的距离

    求当前结点到根节点的距离 Sample Input 2 1 //n m 1 2 1 2 //询问 5 2 1 2 1 3 3 4 3 5 4 2 //询问 4 5 0 0 Sample Output ...

  8. 用递归的方法求一个数组的前n项和

    用递归的方法求一个数组的前n项和 public class Demo1 { /* * 用递归的方法求一个数组的前n项和 */ public static void main(String[] args ...

  9. FFT模板 生成函数 原根 多项式求逆 多项式开根

    FFT #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> ...

随机推荐

  1. Wireshark 过滤器的使用

    符号 例子 = = tcp.port = = 80 过滤出来TCP包含80端口的数据包 != ip.src != 127.0.0.1 ip的原地址不是127.0.0.1过滤出来 > lp.len ...

  2. Java 是编译型语言还是解释型语言?

    Java首先由编译器编译成.class类型的文件,这个是java自己类型的文件.然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行.因此Java是一种半编译半解释的语言,理解这种意思即可 ...

  3. Android构建工具--AAPT2源码解析(一)

    一.什么是AAPT2 在Android开发过程中,我们通过Gradle命令,启动一个构建任务,最终会生成构建产物"APK"文件.常规APK的构建流程如下: (引用自Google官方 ...

  4. time_formatter攻防世界学习

    time_formatter 前言:这题说实话分析量蛮大的,首先是程序内壁比较绕,而且调用了之前许多没有见到的函数---如snprintf_che,以及strsup(好像打错了),getegid(), ...

  5. Noip模拟10 2021.6.27

    T1 入阵曲 好了,又一个考试败笔题. 也就是在那个时候,小 F 学会了矩阵乘法.让两个矩阵乘几次就能算出斐波那契数, 真是奇妙无比呢. 不过, 小 F 现在可不想手算矩阵乘法--他觉得好麻烦.取而代 ...

  6. lollipop_softap启动wifi ap失败

    最近一直在调试lollipop,翻译成中文好像是棒棒糖的意思,就是个wifi控制管理工具,比如设置DLNA或者WFD模式等,其原理是通过本地通信工具sockets控制其他接口来启动wpa_suplic ...

  7. Vue&Element开发框架中增加工作流处理,查看申请单中整合多个处理类型的处理

    关于我在Winform框架.混合框架.Bootstrap开发框架中的简易审批性工作流模块,我写过不少文章,有兴趣可以参考<工作流模块>的随笔进行了解,本篇随笔在完成了Vue&Ele ...

  8. Fiddler抓包工具简介:(三)手机端代理配置

    1.接入网络:需要在移动终端(手机或pad)上指定代理服务器为Fiddler所在主机的IP,端口默认为8888,要保证手机和安装有fiddler的电脑处在同一局域网内,手机能ping通电脑. [方法] ...

  9. MySQL高级篇 | MySQL逻辑架构

    思维导图 架构逻辑视图 每个虚线框为一层,总共三层. 第一层:连接层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. 第二 ...

  10. OpenHarmony LiteOS C-SKY指令集移植指北

    摘要:本文介绍在OpenHarmony社区LiteOS-M项目中新增C-SKY指令集的开发流程,以及适配相应qemu工程的方法和步骤,供LiteOS内核相关开发者学习交流. 本文分享自华为云社区< ...