精华内容
下载资源
问答
  • %%%程序编写者 西北工业大学自动化学院 Email: yincwxa2013@mail.nwpu.edu.cn%% All rights reservedclearclcx1=input('输入迭代初值x1=')x2=input('输入迭代初值x2=')t=1;epuc=input('输入精度要求eupc=')if epuc&...

    %%%程序编写者  西北工业大学自动化学院    Email: yincwxa2013@mail.nwpu.edu.cn

    %%  All rights reserved

    clear

    clc

    x1=input('输入迭代初值x1=')

    x2=input('输入迭代初值x2=')

    t=1;

    epuc=input('输入精度要求eupc=')

    if epuc>0

    epuc=epuc;

    else epuc=0.000001

    end

    while(t>epuc)

    x3=(1+x2-0.1*exp(x1))/4

    x4=(x1-x1^2/8)/4

    t=max(abs([x3-x1,x4-x2]));

    x1=x3;

    x2=x4;

    end

    x=[x3  x4]

    %%%%%

    输入迭代初值x1=0.423

    x1 =

    0.4230

    输入迭代初值x2=2.58

    x2 =

    2.5800

    输入精度要求eupc=0.001

    epuc =

    1.0000e-003

    x3 =

    0.8568

    x4 =

    0.1002

    x3 =

    0.2161

    x4 =

    0.1913

    x3 =

    0.2668

    x4 =

    0.0526

    x3 =

    0.2305

    x4 =

    0.0645

    x3 =

    0.2346

    x4 =

    0.0560

    x3 =

    0.2324

    x4 =

    0.0569

    x3 =

    0.2327

    x4 =

    0.0564

    x =

    0.2327    0.0564

    转载本文请联系原作者获取授权,同时请注明本文来自殷春武科学网博客。

    收藏

    分享

    分享到:

    展开全文
  • %%%程序编写者 西北工业大学自动化学院 Email: yincwxa2013@mail.nwpu.edu.cn%% All rights reservedclearclcx1=input('输入迭代初值x1=')x2=input('输入迭代初值x2=')t=1;epuc=input('输入精度要求eupc=')if epuc&...

    %%%程序编写者  西北工业大学自动化学院    Email: yincwxa2013@mail.nwpu.edu.cn

    %%  All rights reserved

    clear

    clc

    x1=input('输入迭代初值x1=')

    x2=input('输入迭代初值x2=')

    t=1;

    epuc=input('输入精度要求eupc=')

    if epuc>0

    epuc=epuc;

    else epuc=0.000001

    end

    while(t>epuc)

    x3=(1+x2-0.1*exp(x1))/4

    x4=(x1-x1^2/8)/4

    t=max(abs([x3-x1,x4-x2]));

    x1=x3;

    x2=x4;

    end

    x=[x3  x4]

    %%%%%

    输入迭代初值x1=0.423

    x1 =

    0.4230

    输入迭代初值x2=2.58

    x2 =

    2.5800

    输入精度要求eupc=0.001

    epuc =

    1.0000e-003

    x3 =

    0.8568

    x4 =

    0.1002

    x3 =

    0.2161

    x4 =

    0.1913

    x3 =

    0.2668

    x4 =

    0.0526

    x3 =

    0.2305

    x4 =

    0.0645

    x3 =

    0.2346

    x4 =

    0.0560

    x3 =

    0.2324

    x4 =

    0.0569

    x3 =

    0.2327

    x4 =

    0.0564

    x =

    0.2327    0.0564

    转载本文请联系原作者获取授权,同时请注明本文来自殷春武科学网博客。

    链接地址:http://blog.sciencenet.cn/blog-748007-751139.html

    上一篇:数值分析--多项式拟合程序matlab程序

    下一篇:数值分析--非线性方程组牛顿迭代法matlab程序

    展开全文
  • 在对第4题第3问进行分析的过程中,发现matlab程序能够更加直观的求解计算这个问题。 clc; clear; x=2; m=0.00001; N=60; for k=1:N y=x-1/2/sqrt(3)*(x^2-3); if (abs(x-y))>=m format long k y=double(y) x...

    在这里插入图片描述在对第4题第3问进行分析的过程中,发现matlab程序能够更加直观的求解计算这个问题。

    clc;
    clear;
    x=2;
    m=0.00001;
    N=60;
    for k=1:N
    y=x-1/2/sqrt(3)*(x^2-3);
     if (abs(x-y))>=m
         format long
         k
         y=double(y)
         x=y;
     else disp('find it!')
         k
         y
         break
     end
    end
    

    程序中x(迭代初始值),m(迭代精确度),N(可以用来修改迭代次数),函数y,这些变量均可以修改。

    展开全文
  • 数值分析matlab程序
  • MATLAB编写关于如何用史蒂芬不动点迭代法解线性方程组的程序
  • 对于形如f(x)=0的单变量非线性方程,可以构造不同的迭代函数进行迭代求根,以f(x)=x3-x-1为例,我们可以简单的通过等式变形构造出x...%不动点迭代法1 clc; clear; syms x;%定义变量x f(x)=input('请输入函数表达式,变量

    对于形如f(x)=0的单变量非线性方程,可以构造不同的迭代函数进行迭代求根,以f(x)=x3-x-1为例,我们可以简单的通过等式变形构造出x=x3-1和x=(x+1)(1/3)两种等价形式;也可以自己增加x的表达式构建x=(1/2)×(x3+x-1),所以同一个非线性方程可以构建无穷多的等价形式,只要最终可以化简成f(x)=0的形式就行;
    不动点迭代是最基础的迭代法,其代码如下:
    代码块1:

    %不动点迭代法1
    clc;
    clear;
    syms x;%定义变量x
    f(x)=input('请输入函数表达式,变量用x表示:f(x)=');
    g(x)=input('请输入等价形式:x=');  %f(x)=0等价为x=g(x)
    x1=input('请选择一个初始值:x1=');
    eps=input('请输入停止精度要求:eps=');%|b-xk|<=eps/2
    k=1;
    x=[x1];  %定义数组x,存储每次迭代产生的xk
    k=k+1;%迭代次数,注意k=2时对应第1次迭代
    x2=g(x1);%1次迭代,x2对应数组x中的x(2)
    x=[x x2];   %把新产生的x2按顺序装进数组x
    T=[1,x1,f(x1);2,x2,f(x2)];   %T初始值为23列,随着迭代增加行数
    while (abs(x(k)-x(k-1))>eps/2)   %判断是达到求根的精度要求,未达到则执行循环(小于才是达到要求)
        if (k>1000)||(abs(f(x(k)))>1e15)    %1000次还没有达到精度要求的话,报错
            error('迭代出错!或许是迭代公式的问题')
        else
            k=k+1;%迭代次数加一
            xk=vpa(g(x(k-1)),30);%产生新的xk,第一次产生x3;注意:可以用vpa函数,控制每次迭代产生xk的有效数字位数,提升迭代速度
            x=[x xk]; %新产生的xk依次装入数组x中,注意:x(1)=x1,x(2)=x2,x(3)=x3
            T=[T;k,xk,f(xk)];%把此次迭代产生的数据装入存储矩阵T中
        end
    end
    fprintf('   k            xk              f(xk)\n');%输出表头
    disp(vpa(T,10));%控制输出的有效数字为8位,根据精度可以自行设置
    fprintf('经过%d次迭代,函数方程根的近似解为:x=%.8f\n',k,T(k,2))%注意迭代次数为k-1fprintf('f(x(%d))=%.8f\n',k,T(k,3))
    

    写程序的时候要注意数组和矩阵的下标不能为0,所以迭代计数器k是从1开始的,最后输出时要注意减1;这里循环的判断是由数组x来实现的,我们可以对代码进行精简,去掉数组x,如代码块2所示:
    代码块2:不动点迭代法-精简版

    %不动点迭代法2
    clc;%清屏
    clear;%清工作区
    syms x;%定义变量x
    f(x)=input('请输入函数表达式,变量用x表示:f(x)=');
    g(x)=input('请输入等价形式:x=');  %f(x)=0等价为x=g(x)
    x0=input('请选择一个初始值:x0=');
    eps=input('请输入停止精度要求:eps=');%|b-xk|<=eps/2
    k=0;
    T=[0,x0,f(x0)];
    k=k+1;%k=1,第k次迭代
    xk=g(x0);%1次迭代
    T=[T;k,xk,f(xk)];
    while (abs(g(xk)-xk)>eps/2)||(abs(f(xk))>1)  %判断是达到求根的精度要求,未达到则执行循环(小于才是达到要求)
        if (k>1000)||(abs(f(xk))>1e15)    %1000次还没有达到精度要求的话,报错
            error('迭代出错!或许是迭代公式的问题')
        else
            k=k+1;%迭代次数加一
            xk=vpa(g(xk),30);%产生新的xk,第一次产生x3;注意:可以用vpa函数,控制每次迭代产生xk的有效数字位数,提升迭代速度
            T=[T;k,xk,f(xk)];%把此次迭代产生的数据装入存储矩阵T中
        end
    end
    T=[T;k+1,g(xk),f(g(xk))];%再加一行是因为while循环判断用的时k+1次的数据
    fprintf('   k            xk              f(xk)\n');%输出表头
    disp(vpa(T,10));%控制输出的有效数字为10位,根据精度可以自行设置
    fprintf('经过%d次迭代,函数方程根的近似解为:x=%.8f\n',k+1,T(k+2,2))%注意迭代次数为k次
    fprintf('f(x(%d))=%.8f\n',k+1,T(k+2,3))%当k做下标时,要加1
    

    这两个思路是有一些不同的哈,代码中需要特别注意的点我在注释里标的已经很清楚了,就不再多说了
    函数表达式的输入也可以通过内联函数inline实现,如代码块3所示:
    代码块3:不动点迭代法-内联函数版

    %不动点迭代法3
    clc;
    clear;
    format short;
    s=input('请输入函数表达式:f=','s');
    f=inline(s);
    m=input('请输入等价形式:x=','s');
    g=inline(m); %g为方程的等价形式,f(x)=0等价为x=g(x)
    x0=input('请选择一个初始值:x0=');
    eps=input('请输入停止精度要求:eps=');    %|b-xk|<=eps/2
    k=1;
    x=[x0];                                 %定义数组x
    k=k+1;
    x1=g(x0);
    x=[x x1];                               %把新产生的x1装进数组x中
    T=[1,x0,f(x0);2,x1,f(x1)];   %T初始值为23列,随着迭代增加行数
    while abs(x(k)-x(k-1))>eps/2
        if abs(f(x(k)))>1e15||(k>5000)%
            error('迭代出错!或许是迭代公式的问题')
        else
            k=k+1;
            xk=g(x(k-1));
            x=[x xk]; %x(1)=x0,x(2)=x1,x(3)=x3,
            T=[T;k,xk,f(xk)];
        end
    end
    fprintf('    k               xk               f(xk)\n');
    disp(vpa(T,10));
    fprintf('经过%d次迭代,函数方程根的近似解为:x=%.8f\n',k-1,T(k,2))
    

    还需要提醒一下就是迭代很有可能不收敛,因为迭代不收敛时方程f(x)的值可能越来越大,最起码不会逼近0,所以可以通过迭代次数k的值以及方程f(x)的来判断是否出现迭代出错;
    斯蒂芬森迭代、牛顿法以及简化牛顿法相较于不动点迭代而言,代码的实现思路时一样的,把迭代函数修改一下就行,其代码块分别如下:

    代码块4:斯蒂芬森迭代-内联函数版

    %斯蒂芬森迭代法1
    clc;
    clear;
    format long;
    s=input('请输入函数表达式:f=','s');
    f=inline(s);
    m=input('请输入等价形式:x=','s');
    g=inline(m);                            %g为方程的等价形式,f(x)=0等价为x=g(x)
    x1=input('请选择一个初始值:x1=');
    eps=input('请输入停止精度要求:eps=');    %|b-xk|<=eps/2
    k=1;
    y1=g(x1);     %y1=g(x0);
    z1=g(y1);     %z1=g(y1);
    x=[x1];                                 %定义数组x
    y=[y1];                                 %定义数组y
    z=[z1];                                 %定义数组z
    k=k+1;        %k=2
    x2=x1-(y1-x1)^2/(z1-2*y1+x1);
    y2=g(x2);     %;
    z2=g(y2);     %;
    x=[x x2];                               %把新产生的x2装进数组x中
    y=[y y2];                               %把新产生的y2装进数组y中
    z=[z z2];                               %把新产生的z2装进数组x中
    fprintf('    k                   xk                  yk                  zk                     f(xk)\n');
    T=[1,x1,y1,z1,f(x1);2,x2,y2,z2,f(x2)];   %T初始值为25列,随着迭代增加行数
    while abs(x(k)-x(k-1))>eps/2
        if (abs(f(x(k)))>1e15)||(k>50)
            error('迭代出错!或许是迭代初值不对的问题')
        else
            k=k+1;
            xk=x(k-1)-(y(k-1)-x(k-1))^2/(z(k-1)-2*y(k-1)+x(k-1));
            x=[x xk]; %
            yk=g(x(k));
            y=[y yk];
            zk=g(yk);
            z=[z zk];
            T=[T;k,xk,yk,zk,f(xk)];
        end
    end
    disp(T);
    fprintf('经过%d次迭代,函数方程根的近似解为:x=%.8f\n',k-1,T(k,2))
    

    内联函数版都是我复习前为了交作业写的,内联函数也不太好使,还是看下面这一版比较好:
    代码块5:斯蒂芬森迭代法

    %steffensen迭代法
    clc;%清屏
    clear;%清工作区
    syms x;%定义变量x
    f(x)=input('请输入函数表达式,变量用x表示:f(x)=');
    g(x)=input('请输入等价形式:x=');  %f(x)=0等价为x=g(x)
    x1=input('请选择一个初始值:x1=');
    eps=input('请输入停止精度要求:eps=');    %|b-xk|<=eps/2
    k=1;
    y1=g(x1);     %y1=g(x0);
    z1=g(y1);     %z1=g(y1);
    x=[x1];       %定义数组x
    y=[y1];       %定义数组y
    z=[z1];       %定义数组z
    k=k+1;        %k=2
    x2=x1-(y1-x1)^2/(z1-2*y1+x1);
    y2=g(x2);     %;
    z2=g(y2);     %;
    x=[x x2];                               %把新产生的x2装进数组x中
    y=[y y2];                               %把新产生的y2装进数组y中
    z=[z z2];                               %把新产生的z2装进数组x中
    T=[1,x1,y1,z1,f(x1);2,x2,y2,z2,f(x2)];   %T初始值为25列,随着迭代增加行数
    while abs(x(k)-x(k-1))>eps/2
        if (abs(f(x(k)))>1e15)||(k>500)
            error('迭代出错!或许是迭代初值不对的问题')
        else
            k=k+1;
            xk=vpa(x(k-1)-(y(k-1)-x(k-1))^2/(z(k-1)-2*y(k-1)+x(k-1)),30);
            x=[x xk]; %
            yk=g(x(k));
            y=[y yk];
            zk=g(yk);
            z=[z zk];
            T=[T;k,xk,yk,zk,f(xk)];
        end
    end
    fprintf('  k             xk           yk           zk                   f(xk)\n');
    disp(vpa(T,10));%控制输出的有效数字为10位,根据精度可以自行设置
    fprintf('经过%d次迭代,函数方程根的近似解为:x=%.8f\n',k-1,T(k,2))
    

    注意这一行:

     xk=vpa(x(k-1)-(y(k-1)-x(k-1))^2/(z(k-1)-2*y(k-1)+x(k-1)),30);
    

    要控制一下精度哈,不然直接用分数计算,计算量太大了,算不动,太慢了
    也可以考虑精简一下代码把数组x,y,z去掉,但是并不如这样直观,可以自己动手试着改一下,我懒得改了~

    牛顿法代码:
    代码块6:牛顿法

    clc;clear;
    format long;
    syms x;
    f(x)=input('请输入函数表达式,变量用x表示:f(x)=');
    x1=input('请选择一个初始值:x1=');
    eps=input('请输入停止精度要求:eps='); 
    df(x)=diff(f,x);%f(x)的导数
    g(x)=f(x)/df(x);
    h(x)=x-g(x);%迭代函数
    k=1;
    xk=x1;
    k=k+1;
    xk=h(xk); 
    T=[1,x1,f(x1);k,xk,f(xk)];   %T初始值为23列,随着迭代增加行数
    while abs(h(xk)-xk)>eps/2||f(xk)>eps/2
        if (df(xk)==0)||(k>5000)        %error('迭代出错!或许是迭代初值的问题')
        else
            k=k+1;
            xk=vpa(h(xk),30); 
            T=[T;k,xk,f(xk)];
        end
    end
    fprintf('     k           xk              f(xk)\n');
    disp(vpa(T,10))
    fprintf('经过%d次迭代,函数方程根的近似解为:x=%.8f\n',k-1,T(k,2))%注意迭代次数为k-1
    fprintf('f(x(%d))=%.8f\n',k-1,T(k,3))
    

    懒了懒了,不想写了,再贴一个代码就去打游戏去;
    简化牛顿法代码:

    clc;clear;
    format long;
    syms x;
    f(x)=input('请输入函数表达式,变量用x表示:f(x)=');
    x1=input('请选择一个初始值:x1=');
    eps=input('请输入停止精度要求:eps='); 
    df(x)=diff(f,x);%f(x)的导数
    g(x)=f(x)/df(x);
    h(x)=x-g(x);%迭代函数
    k=1;
    xk=x1;
    k=k+1;
    xk=h(xk); 
    T=[1,x1,f(x1);k,xk,f(xk)];   %T初始值为23列,随着迭代增加行数
    while abs(h(xk)-xk)>eps/2||f(xk)>eps/2
        if (df(xk)==0)||(k>5000)        %error('迭代出错!或许是迭代初值的问题')
        else
            k=k+1;
            xk=vpa(h(xk),30); 
            T=[T;k,xk,f(xk)];
        end
    end
    fprintf('     k           xk              f(xk)\n');
    disp(vpa(T,10))
    fprintf('经过%d次迭代,函数方程根的近似解为:x=%.8f\n',k-1,T(k,2))%注意迭代次数为k-1fprintf('f(x(%d))=%.8f\n',k-1,T(k,3))
    

    溜了溜了~~~

    展开全文
  • 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/一、实验原理二、实验步骤三、实验过程1.(程序)(1)二分法:求在区间(1,2)之间的根,取(a)bipart.m:function [x,m]=bipart(fun,a0,b0,tol)a=a0;...
  • function [x_reality,n_reality] = Simple_stepit( f_name,x_start,tolerance,n_limit)%%% 简单迭代法(也叫不动点迭代法)求解方程f_name = 0根的MATLAB实现% f_name为迭代函数% x_start为开始迭代的初始坐标% ...
  • MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一、实验原理 二、实验步骤 三、实验过程 1.(程序) (1)二分法:求 ...
  • 数值分析作业 姓 名 王建忠 学 号 132080202006 学 院 能源与动力工程 专 业 机械电子工程 2013年 12月16 日 1.Lagrange插值多项式程序 function f=nalagr(x,y,xx) %x为节点向量 %y为节点函数值 %xx是插值 syms s ...
  • 简单迭代法求方程根的MATLAB程序

    千次阅读 2012-07-13 22:30:20
    function [x_reality,n_reality] = Simple_stepit...% 简单迭代法(也叫不动点迭代法)求解方程f_name = 0根的MATLAB实现 % f_name为迭代函数 % x_start为开始迭代的初始坐标 % tolerance为函数迭代的精度要求 ...
  • 优质解答%%以下是不动点程序function [xc,num,eps] = fpi(g,x0,phi,step)if nargin stepdisp('超过迭代次数,可能不收敛')break;endendxc = afterNum;==================下面是该程序的用法,比如...
  • 一、实验原理二、实验步骤三、实验过程1.(程序)(1)二分法:求在区间(1,2)之间的根,取(a)bipart.m:function [x,m]=bipart(fun,a0,b0,tol)a=a0;b=b0;m=1+round(round(log((b-a)/tol))/log(2));for k=1:mp=(a+b)/2;if...
  • 一、 科学计算的算法...计算方法及MATLAB实现 第4章 非线性方程与方程组的数值解法 4.1 4.2 4.3 4.4 4.5 方程求根与二分法 不动点迭代法及其收敛性 迭代收敛的加速方法 牛顿法 弦截法......matlab程序设计实践-牛...
  • 再者我们考究一下 牛顿迭代法求最优问题,牛顿法相对最速下降法的速度就快得多了,而且还有一个好处就是能高度逼近最优值,而不会出现死等待的现象。 如后面的精度,你可以取如:0.0000000000001等。 但是牛顿法也...
  • 非线性方程组求解matlab程序

    热门讨论 2010-02-04 16:55:12
    mulStablePoint 用不动点迭代法求非线性方程组的一个根 mulNewton 用牛顿法法求非线性方程组的一个根 mulDiscNewton 用离散牛顿法法求非线性方程组的一个根 mulMix 用牛顿-雅可比迭代法求非线性方程组的一个根 ...
  • StevenStablePoint 用史蒂芬森加速的不动点迭代法求方程的一个根 Secant 用一般弦截法求方程的一个根 SinleSecant 用单点弦截法求方程的一个根 DblSecant 用双点弦截法求方程的一个根 PallSecant 用平行弦截法求方程...
  • 求解方程:不动点法,二分法,牛顿,求重根,加速等 插值:拉格朗日,runge现象,neville插值 数值微分:龙贝格 初值问题:欧拉,改进欧拉,runge-kutta order four 线性方程组:迭代,高斯jacbobi等 等等等等 ...
  • matlab数值计算程序[PDF]

    热门讨论 2010-08-07 15:03:09
    4.5. 不动点迭代法.................................................................................................................44 4.6. 试值法或试位法..................................................
  • 其中以求得验算为目的迭代的二次多项式序列响应面应用较为广泛, 本文给出了该方法的Matlab程序。提出了基于Matlab的插值响应面和BP神经网络响应面, 介绍了其在Matlab环境下的实现方法, 并进行了三种方法的...
  • 语音识别的MATLAB实现

    热门讨论 2009-03-03 21:39:18
    语音识别的MATLAB实现 声控小车结题报告 小组成员:关世勇 吴庆林 一、 项目要求: 声控小车是科大华为科技制作竞赛命题组的项目,其要求是编写一个语言识别程序并适当改装一个小型机动车,使之在一个预先知道...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

不动点迭代法matlab程序

matlab 订阅