zoukankan      html  css  js  c++  java
  • 数值分析实验之非线性方程求根(MATLAB实现)

    一、实验目的

      1. 了解一般非线性方程的求根是比较复杂的事情:要讨论(或知道)它有无实根,有多少实根;知道求近似根常用的几种方法,每种方法的特点是什么。

      2. 用通过二分法(区间半分法)、不动点(也Picard)迭代法及Newton迭代(切线)法求其它非线性方程的根,并尽可能估计误差。

    二、实验原理

        

     三、实验程序

        

     四、实验内容

       1. 用二分法求方程x3-3x-1=0在的所有根.要求每个根的误差小于0.001.

       提示与要求: (1) 利用精度找到迭代次数;

               (2) 由f(x)=3(x2-1)可取隔根区间[-2,-1].[-1,1].[1,2]);

               (3) 用程序求各隔根区间内的根.

     2. 用不动点迭代求: (1)x3+2x2+10x-20=0的所有根.

               或: (2)9x2-sinx-1=0在[0,1]上的一个根.

     3. 用Newton迭代法求解下列之一,准确到10-5:

       (1) x3-x-1=0的所有根;

       (2) ex+2-x+2cosx-6=0位于[0,2]上的根.

     五、实验程序

        • 二分法:

    文件代码:
    function y = f(x)
    y=x^3-3*x-1;
    end
    
    程序代码:
    function Bipart(a0,b0,tol)
    %a0为左区间,b0为右区间,tol为区间误差限
    a=a0;b=b0;
    m=ceil(log((b-a)/tol)/log(2));
    for k=1:m
        p=(a+b)/2;
        if f(p)*f(b)<0
            a=p;
        else
            b=p;
        end
    end
    disp(['经过二分法求得的跟为:x=',num2str((a+b)/2,'%.6f')])
    disp(['共经过',num2str(k),'次计算'])
    
    命令窗口:
    Bipart(-2,-1, 0.001)
    Bipart(-1, 1, 0.001)
    Bipart (1,2, 0.001)
    

     运行结果:

         

        • 不动点法:

    文件代为:
    function y = f(x)
    y=9*x^2-sin(x)-1;
    end
    
    程序代码:
    function Budongdian(x0,tol,m)
    %x0为初始值,tol为误差容限,m为最大迭代次数
    syms x
    F(x)=sqrt(sin(x)+1)/3;
    m=m;
    text='';
    x=[];
    x(1)=x0;
    for k=1:m
       x(k+1)=F(x(k));
       if (abs(x(k+1)-x(k))<=tol)==1
           text='迭代成功';
           disp(text);
           disp(['经过不动点迭代法求得的跟为:x=',num2str(x(k+1),'%.7f')]);
           disp(['共经过',num2str(k),'次计算'])
           break
       end
    end
    if isempty(text)==1
        disp('Method failed')
    end
    
    命令窗口:
    Budongdian(1, 0.00001, 100)
    

       运行结果:

      

        • 牛顿迭代法:

    文件代码:
    function y = f(x)
    y=exp(x)+2^(-x)+2*cos(x)-6;
    end
    
    程序代码:
    function Newton_gen(x0,tol,m)
    %x0为初始值,tol为误差容限,m为最大迭代次数
    syms x
    F(x)=x-f(x)/diff(f(x));
    m=m;
    text='';
    x=[];
    x(1)=x0;
    for k=1:m
       x(k+1)=F(x(k));
       if (abs(x(k+1)-x(k))<=tol)==1
           text='迭代成功';
           disp(text);
           disp(['经过Newton迭代法求得的跟为:x=',num2str(x(k+1),'%.7f')]);
           disp(['共经过',num2str(k),'次计算'])
           break
       end
    end
    if isempty(text)==1
        disp('Method failed')
    end
    
    命令窗口:
    Newton_ .gen(2, 0.00001, 100)
    

      运行结果:

       

    另解:

     • 二分法:

    定义函数:
    function Bipart_2(a0,b0,tol,Tol)
    %a0为左区间,b0为右区间,tol为区间误差限,Tol为f误差限
    a=a0;b=b0;
    m=ceil(log((b-a)/tol)/log(2));
    for k=1:m
        p=(a+b)/2;
        if f(p)*f(b)<0
            a=p;
        else
            b=p;
        end
        if abs(f((a+b)/2))<Tol
            break;
        end
    end
    disp(['经过二分法求得的跟为:x=',num2str((a+b)/2,'%.6f')])
    disp(['共经过',num2str(k),'次计算'])
        
    命令窗口:
    Bipart. .2(-1, 1,0.001,0.1)
    Bipart_ .2(-1, 1, 0.001, 0.000001)
    

      运行结果:

       

    • 不动点法:

    定义函数:
    function [x,k]=budong(fun,x0,tol,m)
    for k=1:m
        x=fun(x0);
        if abs(x-x0)<tol
     break;
    end
    x0=x;
    end
    x=vpa(x,8);
    
    function t=fun(x1)
    syms x;
    f=9*x.*x-sin(x)-1;
    s=subs(diff(f,x),x,x1);
    x=x1;
    f=9*x.*x-sin(x)-1;
    t=x-f/s;
    
    命令行窗口输入:
    [x,k]=budong(@fun,0.5,1e-5,100)
    

     运行结果:

         

  • 相关阅读:
    JqueryAjax 常用复制
    linux 下调用wps 注意
    java 里执行javascript代码
    JS学习笔记
    javascript 区域外事件捕捉setCapture
    【MySQL基础打卡(一)】查询语句项目作业
    【分类问题中模型的性能度量(二)】超强整理,超详细解析,一文彻底搞懂ROC、AUC
    【分类问题中模型的性能度量(一)】错误率、精度、查准率、查全率、F1详细讲解
    【机器学习实战学习笔记(1-2)】k-近邻算法应用实例python代码
    【机器学习实战学习笔记(1-1)】k-近邻算法原理及python实现
  • 原文地址:https://www.cnblogs.com/ynly/p/12894178.html
Copyright © 2011-2022 走看看