MATLAB用二分法、不動點迭代法及Newton迭代(切線)法求非線性方程的根

来源:http://www.cnblogs.com/kailugaji/archive/2017/05/30/6920975.html
-Advertisement-
Play Games

一、實驗原理 二、實驗步驟 三、實驗過程 1.(程式) (1)二分法:求 在區間(1,2)之間的根,取 (a)bipart.m: (b)fun1.m: (2)不動點迭代法:求方程在附近的根,取 (a)budong.m: (b)fun.m (3)牛頓迭代法:求方程在附近的根,取 newton.m: 2 ...


一、實驗原理

二、實驗步驟

三、實驗過程

1.(程式)

(1)二分法:求   在區間(12)之間的根,取

abipart.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:m
    p=(a+b)/2;     
    if fun(p)*fun(b)<0
            a=p;
    else
            b=p;
    end
    x=p;
end
end 

(b)fun1.m:

function f=fun1(x)
f=x^3+10*x-20;

 2)不動點迭代法:求方程附近的根,取

(a)budong.m:

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);

   (b)fun.m

function t=fun(x1)
syms x;
f=x^3-2*x-5;
s=subs(diff(f,x),x,x1);
x=x1;
f=x^3-2*x-5;
t=x-f/s;

3)牛頓迭代法:求方程附近的根,取

newton.m:

function x1=newton(t1,esp,m)

syms x;

fun=x^3+2*x-5;

for k=1:m

    if abs(subs(diff(fun,'x'),x,t1))<esp

        x1=t1;

        break;

    else

        if subs(diff(fun,'x',2),x,t1)==0

            break;

            disp('解題失敗!')

        else

            t0=t1;

            t1=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);

            if abs(t1-t0)<esp

                x1=t1;

                break;

            end

        end

    end

end

x1=vpa(x1,8);

2.(運算結果)

(1)二分法:

>> [x,m]=bipart(@fun1,1,2,0.0001)
x =
    1.5945
m =
    14

  

(2)不動點迭代法:

>> [x,k]=budong(@fun,2,1e-5,100)
x =
2.0945515
k =
     4

  

(3)牛頓迭代法:

    

 >> x1=newton(2,1e-4,20)
     x1 =
        1.3282689
 

  

3.(拓展(方法改進、體會等))

對於方程的根為重根的情形,newton法求重根只是線性收斂,迭代緩慢,如果對於求重根的情形,對newton法進行改進,取

             ,

。用迭代法

                  

m重根,則具有二階收斂性,但要知道的重數m。

   計算方程的根是二重根,用newton法與改進方法求根。

源程式:

newton_biroot.m:

function t=newton_biroot(x1)

syms x;

f=x^4-4*(x^2)+4;

s=subs(diff(f,x),x,x1);

x=x1;

f=x^4-4*(x^2)+4;

t=x-f/s;

biroot1.m:

function t=biroot1(x1)

syms x;

f=x^4-4*(x^2)+4;

s=subs(diff(f,x),x,x1);

x=x1;

f=x^4-4*(x^2)+4;

t=x-2*f/s;

budong.m:

function [x,k]=budong(fun,x0,tol,m)

for k=1:m

    x=fun(x0);

    if abs(x-x0)<tol

        break;

    end

    x0=x;

    x=vpa(x,8)

end

x=vpa(x,8);

運行結果:取初值為2

k

          xk

newton

改進方法

1

          x1

1.75

1.5

2

          x2

1.5982143

 

1.4166667

 

3

          x3

1.5115099

 

1.4142157

 

4

          x4

1.4644275

 

1.4142157

 

 計算4步,改進方法就已經收斂,而newton法只是線性收斂,要達到同樣精度需迭代17次。

附結果:

>> [x,k]=budong(@biroot1,2,1e-5,3)

 

x =

 

1.5

 

 

x =

 

1.4166667

 

 

x =

 

1.4142157

 

 

x =

 

1.4142157

 

 

k =

 

     3

 

>> [x,k]=budong(@biroot1,2,1e-5,10)

 

x =

 

1.5

 

 

x =

 

1.4166667

 

 

x =

 

1.4142157

 

 

x =

 

1.4142136

 

 

k =

 

     4

 

>> [x,k]=budong(@newton_biroot,2,1e-5,50)

 

x =

 

1.75

 

 

x =

 

1.5982143

 

 

x =

 

1.5115099

 

 

x =

 

1.4644275

 

 

x =

 

1.439751

 

 

x =

 

1.4270955

 

 

x =

 

1.4206836

 

 

x =

 

1.4174559

 

 

x =

 

1.4158366

 

 

x =

 

1.4150256

 

 

x =

 

1.4146197

 

 

x =

 

1.4144166

 

 

x =

 

1.4143151

 

 

x =

 

1.4142643

 

 

x =

 

1.414239

 

 

x =

 

1.4142263

 

 

x =

 

1.4142199

 

 

k =

 

    17

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫代碼的不要耍小聰明,認認真真的敲。 代碼是給人看的,只是順便給機器去執行。 ...
  • 歡迎大家每天前來打卡~ 訓練營規則 每天出一道練習題,請大家自己完成編碼 第二天的文章中會告訴大家一種或幾種經典解決方法 完成練習的同學,歡迎大家把代碼貼在留言中 如果有問題,也請留言,我會找機會集中解答 希望這種手把手的方式能夠幫助大家儘快掌握C語言編程。 1. 例題 今天我們先來講解一道C語言的 ...
  • 要處理XML文檔,就要先解析(parse)他,解析器時這樣一個程式,讀入一個文件,確認整個文件具有正確的格式,然後將其分解成各種元素,使得程式員能夠訪問這些元素,Java庫提供了兩種XML解析器: 像文檔對象模型(Document Object Model,DOM)解析器這樣的樹型解析器,他們將讀入... ...
  • CASE WHEN 條件 THEN 改變的值 END 1.簡單case函數,使用表達式確定返回值: 語法: CASE title WHEN expression1 THEN result1 WHEN expression2 THEN result2 ... WHEN expressionN THEN ...
  • AlexNet(Alex Krizhevsky,ILSVRC2012冠軍)適合做圖像分類。層自左向右、自上向下讀取,關聯層分為一組,高度、寬度減小,深度增加。深度增加減少網路計算量。 訓練模型數據集 Stanford電腦視覺站點Stanford Dogs http://vision.stanfor ...
  • 7.1 raw_input(): raw_input()是python 的內建函數,通過讀取控制台的輸入與用戶實現交互。 raw_input()可以讓用戶輸入字元串(即等待用戶輸入內容),並存放到一個變數里。 運行結果: 7.2 getpass模塊: 輸入密碼時,如果想要不可見,需要利用 getpa ...
  • 對坦克大戰情有獨鍾是因為大學時候第一次參加程式設計比賽就做的這個游戲。當時用的語言是Java,那個比賽讓我悟出了面向對象的強大之處,我也是從那時開始接觸設計模式的。對我而言,坦克大戰有著非同尋常的意義,所以一定要帶大家用C++實現一下。 坦克大戰 我們依然使用EasyX在控制台程式中製作這個游戲程式 ...
  • 本篇文章整理了幾道Linux下C語言的經典面試題,相信對大家更好的理解Linux下的C語言會有很大的幫助,歡迎大家探討指正。 1、如果在Linux下使用GCC編譯器執行下列程式,輸出結果是什麼? 答案如下: 2、C語言程式不使用任何條件運算符,列印出十次"Hello"? 答案如下: 或是: 3、如果 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...