方程求根——两种加速迭代法

这段代码实现了埃特金加速迭代法和斯特芬森加速迭代法,我们以斯特粉森迭代为例

  1.代码

%%注意,这里的fei不再是形如f(x)=0的形式而是x=fei(x)的形式,有些fei(x)不收敛,需要寻找,X0是初始值,method取值0和1代表上述两种方法
function AIM = Accelerated_iteration_method(fei,X0,epsilon,method)

%%作图
t = X0/2:X0/1000:2*X0;
T = subs(fei,t);
y0 = t;
h=figure;
set(h,‘color‘,‘w‘);
plot(t,T,‘r‘,t,y0,‘b‘);
grid on
legend(‘T:函数图像‘);
xlabel(‘x shaft‘);ylabel(‘y shaft‘);
title(‘函数图像‘);
disp(‘图像中两函数交点为 x = fei(x) 的解‘);
syms x;
X_real = double(solve([fei-x],[0]));
for i = 1:max(size(X_real))
    if isreal(X_real(i)) == 1
        x_real(i) = X_real(i);
    else
        x_real(i) =0;
    end
end
x_real(x_real==0)=[];
for i = 1:max(size(x_real))
    text(x_real(i),x_real(i),[‘(‘,num2str(x_real(i)),‘,‘,num2str(x_real(i)),‘)‘],‘color‘,[0.02 0.79 0.99]);
end

e = floor(abs(log(epsilon)));
if method == 0
    disp(‘此算法为埃特金加速迭代法‘);
    X1 = subs(fei,X0);X2 = subs(fei,X1);
    ub = 100;
    X(1) = X0;X(2) = X1;X(3) = X2;
    for i = 1:ub
        X_ba(i) = X(i) - (X(i+1)-X(i))^2/(X(i)-2*X(i+1)+X(i+2));
        X(i+3) = X_ba(i);
        delta = X(i+3)-X(i+2);
        if abs(delta) < epsilon
            break;
        end
    end
    disp(‘迭代次数为:‘);
    i
    disp(‘Xba,X分别为:‘);
    AIM = vpa([0 0 0 X_ba;X],e);
elseif method == 1
    disp(‘此算法为斯特芬森加速迭代法‘);
    ub = 100;
    X(1) = X0;
    for i = 1:ub
        Y(i) = subs(fei,X(i));
        Z(i) = subs(fei,Y(i));
        X(i+1) = X(i)-(Y(i)-Z(i))^2/(Z(i)-2*Y(i)+X(i));
        delta = X(i+1)-X(i);
        if abs(delta) < epsilon
            break;
        end
    end
    disp(‘迭代次数为:‘);
    i
    disp(‘X,Y,Z分别为:‘);
    AIM = vpa([X;0 Y;0 Z],e);
end
end

  2.例子

clear all
clc
syms x;
fei =log(x)+log(5);
epsilon=1e-6;
X0 = 0.5;
method = 1;

%%斯特芬森加速迭代法
Z = Accelerated_iteration_method(fei,X0,epsilon,method)

  结果

图像中两函数交点为 x = fei(x) 的解
此算法为斯特芬森加速迭代法
迭代次数为:
i =
    34
X,Y,Z分别为:
Z =
[ 3.5, 3.575575323263, 3.624589351868, 3.657490016934,  3.68002713941, 3.695664194037, 3.706605521034, 3.714304871981, 3.719744047836,  3.72359695842, 3.726331398288, 3.728274642564, 3.729656921924, 3.730640829335, 3.731341507244,  3.73184065469, 3.732196321463,   3.7324497945,  3.73263045906, 3.732759240038, 3.732851043115,  3.73291648892, 3.732963146263, 3.732996409757,  3.73302012473, 3.733037032344, 3.733049086743, 3.733057681058, 3.733063808493, 3.733068177146, 3.733071291853, 3.733073512541, 3.733075095823, 3.733076224655, 3.733077029479]
>>

  (只截取x的迭代值)

原文地址:https://www.cnblogs.com/guliangt/p/12119223.html

时间: 2024-10-07 21:08:07

方程求根——两种加速迭代法的相关文章

关于方程求根的解决方案

对于方程求根主要的思想主要采取迭代的思想,通过条件判断,循环执行直到满足条件以后直接跳出循环输出 下面以x-cos(x)=0:为例  采用do-while 循环,输出Root: #include "stdio.h"#include "math.h"#include "stdio.h"double fun(){ double x1=0,x0; do { x0=x1; x1=cos(x0); } while(fabs(x0-x1)>=1e-6)

方程求根——牛顿迭代法

这段代码实现了牛顿切线法.简化牛顿法和牛顿下山法这三种方程求解法,由于输出结果较长,只以牛顿下山法为例写一段例题 1.代码 %%牛顿迭代法 %%method为-1时为牛顿切线法,method为0时为简化牛顿法,method为1时为牛顿下山法 %%f是表达式f(x) = 0,X0是初值,epsilon是精度,interval是包含解的区间 function NM = Newton_method(f,X0,epsilon,interval,method) Y0 = subs(f,X0); %%作图

方程求根——二分法

二分法求根主要应用了区间套定理,这一算法实现简单且结果也迭代的较好,但对于复杂函数其结果不理想 1.代码 %%二分法求根 %%f为函数表达式,interval0为初始区间,epsilon为控制精度 function RD = Roots_dichotomy(f,interval0,epsilon) x_low = interval0(1);x_up = interval0(2);x_ave = (x_low+x_up)/2; %%作图 t = x_low:(x_up-x_low)/1000:x_

方程求根

一. 二分法 题目:用二分法求方程x3-2x-5=0在区间[2,3]内的一个实根,要求误差不超过0.01. 1 #include <iostream> 2 using namespace std; 3 4 double f(double x) 5 { 6 return x*x*x - 2*x - 5; 7 } 8 9 int main() 10 { 11 double left = 2.0, right = 3.0; 12 double mid; 13 while(right - left &

OJ刷题之《牛顿迭代法求根》

题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b,c,d的值一次为1,2,3,4,由主函数输入.求x在1附近的一个实根.求出根后由主函数输出.结果保留两位小数. 输入 系数a,b,c,d的值 输出 x在1附近的一个实根 样例输入 1 2 3 4 样例输出 -1.65 提示 主函数已给定如下,提交时不需要包含下述主函数 /* C代码 */ int main() { double solut(double ,double ,double ,double ); double

两种求集合所有子集的方法

假设我们有一个求集合的全部子集(包含集合自身)的需求,即有一个集合s,包含两个元素 <a,b>,则其全部的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素对应,数组A中的元素只有两种状态:"1"和"0",分别代表每次子集输出中集合中对应元素是否要输出,这样数组A可以看作是原集合的一个标记位图.

两种求集合全部子集的方法

如果我们有一个求集合的所有子集(包括集合自身)的需求,即有一个集合s,包括两个元素 <a,b>,则其所有的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素相应,数组A中的元素仅仅有两种状态:"1"和"0",分别代表每次子集输出中集合中相应元素是否要输出.这样数组A能够看作是原集合的一个标记位图

根据二叉树的两种遍历求二叉树的结构

二叉树的前序遍历顺序是:根节点,左树,右树 中序遍历顺序是:左树,根节点,右树 后序遍历顺序是:左树,右树,根节点 上面这棵树的前序遍历是:abfcjm   中序遍历是:fbcamj  后序遍历是:fcbmja 根据前序遍历和后序遍历是不能求出树的唯一结构的, 已知的两种遍历顺序必须必须包括中序遍历,因为中序遍历能够递归的推出根节点的左树和右树 如上题已知   前序遍历是:abfcjm   中序遍历是:fbcamj  那么根据前序遍历就可以知道树根是a, 再根据中序遍历就可以知道以a为根节点左树

除法求模中求逆元的两种方法

今天下午还是有点闲的,不想刷题,不想补题,突然想起昨天的training 3里I题涉及到除法取模的问题,就来总结一下 首先对于模运算来说,是没有对于除法的取模的(即没有(a/b)%mod==a%mod/b%mod),但是在很多题目中都涉及到除法取模,所以就必须要了解或者掌握,对于除法取模以(a/b)%mod来说,我们首先需要得到b的逆元,根据逆元的定理 对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元. 然后就是求逆元的两种方法. 第一种方法就是比较普遍的,也是挺基础的,就是