二分法、简单迭代法的matlab代码实现
matlab二分法求根编程

MATLAB二分法求根编程介绍MATLAB是一种强大的数值计算工具,广泛应用于工程、科学和数学领域。
其中,二分法是一种用于求解方程根的常用算法。
通过将区间不断二分,并逐步缩小根的范围,最终找到方程的解。
本文将详细介绍如何使用MATLAB编程实现二分法求根算法。
二分法求根原理二分法求根基于区间不断缩小的原理。
假设我们要求解一个方程f(x)=0的根。
首先,我们需要确定一个包含根的初始区间[a,b]。
通过计算f(a)和f(b)的符号,我们可以判断根是否在该区间内。
如果f(a)和f(b)的符号相同,表示a和b两点的函数值同号,根据零点定理,根不在该区间内。
在这种情况下,我们需要重新选择一个新的区间。
通过将区间划分为两部分,我们可以确定新的区间。
假设区间的中点为c,那么我们可以计算f(c)的符号。
如果f(c)为零,则c即为方程的根。
否则,我们可以判断f(c)和f(a)的符号,如果它们的符号相同,则根位于区间[c,b]内。
反之,如果f(c)和f(a)的符号不同,则根位于区间[a,c]内。
通过不断缩小区间的范围,最终可以找到方程的根。
编程实现为了使用MATLAB实现二分法求根算法,我们可以按照以下步骤进行编程:步骤1:定义函数首先,我们需要定义方程的函数。
假设我们要求解方程x2−4=0的根。
我们可以在MATLAB中定义一个函数,例如:function y = f(x)y = x^2 - 4;end步骤2:确定初始区间接下来,我们需要确定一个初始的区间[a,b]。
我们可以简单地选择两个数,使得f(a)和f(b)的符号不同。
例如,我们可以选择a=1和b=3。
步骤3:实现二分法求根算法我们可以使用一个循环来实现二分法求根算法。
在每一次循环中,我们计算区间的中点c,并判断f(c)的符号。
根据符号的不同,我们更新区间[a,b]的左端点或右端点。
循环终止的条件可以是区间长度小于某个特定的阈值,或者我们达到了最大迭代次数。
matlab的迭代法编程

在MATLAB 中,迭代法是一种通过重复执行一系列步骤来解决问题的方法。
以下是一个使用迭代法求解方程根的示例:
matlab
function=iterative_Method(,,,)
=;
while abs(f())>
=-f()/df();
endend
function=df()
=-1;end
=@()^2-2;
=1;
=2;
=1e-6;
=iterative_Method(,,,);disp(['方程 x^2 - 2 = 0 的根为 ',
num2str()]);
在上述代码中,iterative_Method函数接受一个函数f、区
间[a,b]和精度eps作为输入。
它通过迭代更新x的值,直到abs(f(x))小于eps为止。
在每次迭代中,它使用导数df(x)来更新x的值。
df函数返回导数-1,因为对于方程x^2 - 2 = 0,其导数为2x,在区
间[a,b]内恒为-1。
最后,我们定义了函数f和区间[a,b],并调用iterative_Method函数求解方程的根。
结果将显示在命令窗口中。
运行上述代码,输出结果为:
plaintext
1.41421
这表示方程x^2 - 2 = 0的根约为1.41421,与方程的实际根√2非常接近。
你可以根据需要调整精度eps的值来获得更精确的结果。
[matlab二分法程序代码]matlab牛顿迭代法程序代码
![[matlab二分法程序代码]matlab牛顿迭代法程序代码](https://img.taocdn.com/s3/m/5cd37268a0116c175f0e48ea.png)
[matlab二分法程序代码]matlab牛顿迭代法程序代码篇一: matlab牛顿迭代法程序代码牛顿迭代法主程序:function?[k,x,wuca,yx]?=?newtonk=1;yx1=fun;yx2=fun1;x1=x0-yx1/yx2;while?abs>tolx0=x1;yx1=fun;yx2=fun1;k=k+1;x1=x1-yx1/yx2;endk;x=x1;wuca=abs/2;yx=fun;end分程序1:function?y1=funy1=sqrt-tan;end分程序2:function????y2=fun1%函数fun的导数y2=x/)-1/) );end结果:[k,x,wuca,yx]?=?newtonk?=8x?=0.9415wuca?=4.5712e-08yx?=-3.1530e-14[k,x,wuca,yx]?=?newtonk?=243x?=NaNwuca?=NaNyx?=NaN篇二: 二十个JA V A程序代码1百分制分数到等级分数package pm;public class SwitchTest {//编写程序,实现从百分制分数到等级分数的转换////>=90 A// 80~89 B// 70~79 C// 60~69 D// public static void main {int s=87;switch{case 10 :System.out.println;break; case 9 :System.out.println;break; case 8 :System.out.println;break;case 7 :System.out.println;break;case 6 :System.out.println;break; default :System.out.println;break; }}}2成法口诀阵形package pm;public class SwitchTest{public static void main{for{for{System.out.print+”\t”); }System.out.println;}}}3华氏和摄氏的转换法package pm;import java.util.Scanner;public class SwitchTest {public static void main {Scanner sc=new Scanner;while {System.out.println;String s = sc.next.trim;if ) {//做摄氏向华摄的转换System.out.println;double db = sc.nextDouble; double db2 = + 32;System.out.println;} else if ) {//做华摄向摄氏的转换System.out.println;double db = sc.nextDouble; double db2 = * 5 / 9;System.out.println + “C”); }else if){ break;}}}}package pm;import java.util.Scanner;public class SwitchTest{public static void main {Scanner sc=new Scanner;boolean flag=true;while {System.out.println; String str = sc.nextLine.trim; if || str.endsWith) {//做摄氏向华摄的转换30cString st = str.substring - 1);double db = Double.parseDouble;//[0,2)//2 double db=Double.valueOf.doubleValue; double db2 = + 32;System.out.println;} else if || str.endsWith) {//做华摄向摄氏的转换String st = str.substring - 1);double db = Double.parseDouble;//[0,2)//2 double db=Double.valueOf.doubleValue; double db2 = * 5 / 9;System.out.println + “C”); }else if){flag=false;}}}}4三个数的最大数package pm;public class SwitchTest {public static void main {int a=1,b=2,c=3,d=0;d=a>b?a:b;d=a>b?:;System.out.println;}}5简单计算器的小程序package one;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;public class Jsq implements ActionListener {private JFrame frame;private JButton[] bus;private JTextField jtx;private JButton bu;private char[] strs;private String d_one = ““;private String operator;public static void main { new Jsq;}/* 利用构造进行实例化*/ public Jsq { frame = new JFrame; jtx = new JTextField; bus = new JButton[16]; strs = “789/456*123-0.+=“.toCharArray; for { bus[i] = new JButton; bus[i].addActionListener; } bu = new JButton; bu.addActionListener; init; } /* GUI 初始化*/ public void init { JPanel jp1 = new JPanel; jp1.add; jp1.add; frame.add; } /* 事件的处理*/ public void actionPerformed { /*获取输入字符*/ String conn = arg0.getActionCommand; /*清除计算器内容*/ if ) { JPanel jp2 = new JPanel; jp2.setLayout); for { jp2.add; } frame.add; frame.pack; frame.setLocation; frame.setVisible; frame.setDefaultCloseOperation;d_one = ““; operator = ““; jtx.setText; return; } /*暂未实现该功能*/if){ return; } /*记录运算符,保存运算数字*/ if ) != -1) { if && ““.equals)) return; d_one = jtx.getText; operator = conn; jtx.setText; return; } /*计算结果*/ if ) { if && ““.equals)) return; double db = 0; if ) { db = Double.parseDouble + Double.parseDouble); jtx.setText; } if ) { db = Double.parseDouble - Double.parseDouble); jtx.setText; } if ) { db = Double.parseDouble * Double.parseDouble); jtx.setText; } if ) { db = Double.parseDouble / Double.parseDouble); jtx.setText; } d_one = db + ““; return; }//界面显示jtx.setText + conn);}}6三角形图案package pm;public class SwitchTest{public static void main{int n=5;for{for{System.out.print;}for{System.out.print;}System.out.println;}}}7输出输入的姓名package pm;import java.util.Scanner;public class SwitchTest{public static void main{String name=null;Scanner sca=new Scanner ; char firstChar; do{System.out.println; name=sca.nextLine; firstChar=name.charAt;}while);System.out.println;}}8一小时倒计时小程序package pm;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class SwitchTest {private JFrame frame;private JLabel jl1;private JLabel jl2;private JLabel jl3;/*主方法*/public static void main {new SwitchTest.getTime;}/*倒计时的主要代码块*/private void getTime{long time=1*3600;long hour =0 ;long minute =0 ;long seconds=0;while{hour=time/3600;minute=/60;seconds=time-hour*3600-minute*60; jl1.setText;jl2.setText;jl3.setText;try {Thread.sleep;} catch {e.printStackTrace;}time--;}}/*构造实现界面的开发GUI */ public SwitchTest{frame = new JFrame;jl1 = new JLabel;jl2 = new JLabel;jl3 = new JLabel;init;}/*组件的装配*/private void init{JPanel jp=new JPanel;jp.add;jp.add;jp.add;frame.add;frame.setVisible;frame.setLocation;frame.setSize;frame.setDefaultCloseOperation; } }9棋盘图案public class Sjx{public static void main{int SIZE=19;for{if{System.out.print;//两个空格}else{System.out.print);//两个空格}}System.out.println;// System.out.print:);for{System.out.print;//一个空格}else{System.out.print+” “);//一个空格}for{System.out.print;//两个空格}System.out.println;}}}10数组输出唐诗package day04;public class ArrayTest {public static void main{char[][] arr=new char[4][7];String s=“朝辞白帝彩云间千里江陵一日还两岸猿声啼不住轻舟已过万重山”; for{for{arr[i][j]=s.charAt;}for{for{System.out.print;}System.out.println;}}}11找出满足条件的最小数package day02;public class Fangk{public static void main{// for{// int q=i/1000;// int b=i/100%10;// int s=i/10%10;// int g=i%10;// if{ // System.out.println; // break; // }// }loop1: for{loop2: for{if{continue loop2;}for{for{if{ System.out.println); break loop1;}}}}}}} Min Number12判断一个数是否是素数package day02;public class Fangk{ public static void main{ int num=14;boolean flag=true;for{flag=false;break;}}if{System.out.println; }else{System.out.println; }}}////////////////////////////////////////////////////////////////////// package day04;import java.util.Scanner;public class A1{public static void main{int n;Scanner sca=new Scanner;System.out.println; n=sca.nextInt;if){System.out.println; }else{System.out.println;}public static boolean isPrimeNumber{ for{if{return false;}}return true;}}13一个数倒序排列package day02;public class Daoxu{public static void main{ int olddata=3758;int newdata=0;while{for{newdata=newdata*10+olddata%10; olddata=olddata/10; }System.out.println;}}}14将一个整数以二进制输出package day04;import java.util.Scanner; public class ArrayTest { public static void main{ int n; Scanner s=new Scanner; System.out.println; n=s.nextInt; for{if)!=0){System.out.print;}else{System.out.print;}if%8==0){System.out.print;}}}}15矩形图案package day02;public class Fangk {public static void main{ int m=5,n=6; for{System.out.print;}System.out.println;for{System.out.print;for{System.out.print; }System.out.print;System.out.println;}for{System.out.print;}}}16猜数字package day02;import java.util.Scanner;public class Csz {public static void main {Scanner s = new Scanner; int num = * 1000); int m=0; for{System.out.println; m=s.nextInt;if{System.out.println;}else if{System.out.println;}else{System.out.println; break;}if{System.out.println; }}if{System.out.println; }}}17.HotelManagerpackage hotel;import java.util.Scanner;public class HotelManager {private static String[][] rooms;// 表示房间public static void main {rooms = new String[10][12];String comm;// 表示用户输入的命令for {for {rooms[i][j] = “EMPTY”;}}//while {System.out.println;Scanner sca = new Scanner; System.gc;comm = sca.next;if ) {search;} else if ) {int roomNo = sca.nextInt;String name = sca.next;in;} else if ) {int roomNo = sca.nextInt;out;} else if ) {System.out.println;break;} else {System.out.println; }}}private static void out {if-1][-1])){ System.out.println;} return; } rooms[-1][-1]=“EMPTY”; System.out.println; private static void in { if-1][-1])){ System.out.println;return;}rooms[-1][-1]=name;System.out.println;}private static void search {for {//打印房间号for {if {System.out.print + “ “); } else {System.out.print + “ “); }}//打印房间状态System.out.println;for {System.out.print;}System.out.println;}}}18.StudentManagerpackage day05.student_manager;import java.util.Scanner;public class StudentManager {static int[][] scores=new int[6][5];static String[] students={“zhangsan”,”lisi”,”wangwu”,”zhaoliu”,”qianqi”,”liuba”}; static String[] courses={“corejava”,”jdbc”,”servlet”,”jsp”,”ejb”};public static void main {for{for{scores[i][j]=*100);}}Scanner s=new Scanner; String comm;while{System.out.println; comm=s.next;if){String para=s.next; avg;}else if){String course=s.next; sort;}else if){String student=s.next; String course=s.next; get;}else if){break;}else{System.out.println; }}}//main end!public static void avg{int sIndex=-1;//int cIndex=-1; for{ if){ sIndex=i; } } if{ for{ if){ cIndex=i; } } } if{ System.out.println; return; } double avg=0.0; if{ for{ avg+=scores[sIndex][i]; } avg/=scores[sIndex].length; System.out.println; }else{ for{ avg+=scores[i][cIndex]; } avg/=scores.length; System.out.println; } } public static void sort{ int[] courseScore=new int[scores.length]; if){//如果求总分的排名//求出每个学生的总分,将成绩存放在courseScore数组中for{ int studentSum=0; for{ studentSum+=scores[i][j]; }courseScore[i]=studentSum; } }else{//如果不是求总分排名int cIndex=-1; for{//找到这门课程的下标if){ cIndex=i; } } if{//如果是一门有效的课程//把scores数组中这一列的值放到courseScore数组中!for{ courseScore[i]=scores[i][cIndex]; } }else{//如果不是一门有效的课程System.out.println; return; } } String[] studentCopy=new String[students.length]; System.arraycopy; for{ for{ if{ int temp=courseScore[i]; courseScore[i]=courseScore[j]; courseScore[j]=temp; String stemp=studentCopy[i];studentCopy[i]=studentCopy[j]; studentCopy[j]=stemp; } } } int order=1; System.out.println; for{ if{ order--; }else{ order=i+1;} System.out.print;System.out.print;System.out.println;order++;}}public static void get{int sIndex=-1;int cIndex=-1;for{if){sIndex=i;}}if{System.out.println;return;}if){//如果求总分int studentSum=0;for{studentSum+=scores[sIndex][j];}System.out.println; return;}for{if){cIndex=i;}}if{System.out.println;return;}System.out.println;}}19.Fivepackage hotel;import java.util.Scanner;/*** 首先在程序第一次运行的时候,构建出棋盘,切以后* 不能再从新构建,知道结束,所以将其放到静态代码块中。
matlab计算方程的根

MATLAB计算方程的根一、引言在数学中,方程的根指的是方程中使得等式成立的未知数的值。
解方程是数学中的一项基本操作,它在各个领域都有广泛的应用。
M A TL AB是一种强大的数值计算工具,它提供了多种方法来求解方程的根。
本文将介绍如何使用MA TL AB计算方程的根,包括求解一元方程和多元方程的方法。
二、求解一元方程的方法1.代数方法代数方法是求解一元方程的常用方法之一,它通过移项、合并同类项等代数运算,将方程转化为更简单的形式,从而求解方程的根。
在M A TL AB中,我们可以使用符号计算工具箱(Sy mb ol ic Ma thT o ol bo x)来进行代数运算。
以下是一个求解一元方程的示例代码:s y ms xe q n=x^2-3*x+2==0;s o l=so lv e(eq n,x);2.迭代法迭代法是数值计算中常用的一种方法,它通过逐步逼近方程的根,最终得到一个满足精度要求的解。
M AT LA B提供了多种迭代法求解方程根的函数,如牛顿迭代法(`fz er o`函数)、二分法(`f ze ro`函数)、割线法(`f ze ro`函数)等。
以下是一个使用二分法求解一元方程根的示例代码:f=@(x)x^2-3*x+2;x0=0;%初始猜测值x=fz er o(f,x0);三、求解多元方程的方法1.数值解法对于多元方程组,数值解法是一种常见且有效的求解方法。
MA T LA B提供了多种数值解法的函数,如牛顿法(`f s ol ve`函数)、最小二乘法(`ls qn on li n`函数)等。
这些函数可以根据方程组的特点选择合适的算法进行求解。
以下是一个使用牛顿法求解多元方程组的示例代码:f=@(x)[x(1)^2+x(2)^2-4;x(1)^2-x(2)^2-1];x0=[1;1];%初始猜测值x=fs ol ve(f,x0);2.符号解法在某些情况下,我们可以使用符号计算工具箱来求解多元方程组的精确解。
二分法,牛顿迭代法,matlab

二分法、牛頓迭代法求方程近似解在一些科學計算中常需要較為精確的數值解,本實驗基於matlab 給出常用的兩種解法。
本實驗是以解決一個方程解的問題說明兩種方法的精髓的。
具體之求解方程e^(-x)+x^2-2*x=0,精度e<10^-5;;程序文本文檔如下%%%%%%二分法求近似解cleardisp('二分法求方程的近似解')format longsyms xf=inline('exp(-x)+x^2-2*x');%原函數%通過[x,y]=fminbnd(f,x1,x2)求出極小值點和極小值,進而確定%區間端點,從而確定解區間矩陣CX=[];C=[0 1.16;1.16 2] ; %C(:,1)為解區間的左端點,C(:,2)為解區間右端點ss=length(C); %統計矩陣C的行數,即為方程解的個數for i=1:ssa=C(i,1);b=C(i,2);%f(a)>=0,f(b)<=0e1=b-a;%解一的精度e0=10^-5;%精度ya=f(a);while e1>=e0x0=1/2*(a+b);y0=f(x0);if y0*ya<=0b=x0;elsea=x0;ya=y0;ende1=b-a;endA=[a,b,e1];%解的區間和精度X=[X;A];%解與精度構成的矩陣endX%%%%%%%牛頓迭代法disp('牛頓迭代法解方程的近似解')clear %清空先前變量syms x %定義變量y=exp(-x)+x^2-2*x;%原函數f=inline(y);f1=diff(y); %一階導函數g=inline(f1);format long %由於數值的默認精度為小數點后四位,故需要定義長形X=[];C=[0 1.16;1.16 2] ; %C(:,1)為解區間的左端點,C(:,2)為解區間右端點ss=length(C); %統計矩陣C的行數,即為方程解的個數for i=1:ssa=C(i,1);b=C(i,2);%f(a)>=0,f(b)<=0e0=10^-5; %要求精度i=1; %迭代次數x0=(a+b)/2;A=[i,x0]; %迭代次數,根值的初始方程t=x0-f(x0)/g(x0); %%%%迭代函數while abs(t-x0)>=e0 %%迭代循環i=i+1;x0=t;A=[A;i,x0];t=x0-f(x0)/g(x0);endA ;B=A(i,:);%迭代次數及根值矩陣X=[X;B];endX運行結果如下如若使用matal內置函數fzero,得到如下結果由兩者求得的結果知,使用函數fzero求得的結果精度不夠。
二分法matlab

二分法matlab二分法是一种常用的数值计算方法,也被称为二分查找或折半查找。
它通过将搜索范围逐渐缩小一半来快速定位目标值。
在MATLAB中,我们可以利用二分法来解决一些数值计算问题,下面将介绍二分法的原理和应用。
二分法的基本思想是将搜索范围一分为二,然后确定目标值位于左半部分还是右半部分,然后继续将该部分一分为二。
重复这个过程直到找到目标值或者确定目标值不存在。
二分法的核心就是不断将搜索范围缩小一半。
首先,我们需要确定搜索范围的初始值。
通常情况下,我们会选择数组或者有序列表的首尾元素作为搜索范围的边界。
然后,我们计算出搜索范围的中间位置,并将中间位置的值与目标值进行比较。
如果中间位置的值等于目标值,那么我们就找到了目标值;如果中间位置的值大于目标值,那么目标值可能在左半部分;如果中间位置的值小于目标值,那么目标值可能在右半部分。
根据比较结果,我们可以缩小搜索范围,重复上述步骤直到找到目标值或者确定目标值不存在。
二分法在MATLAB中的应用非常广泛。
下面以两个例子来说明二分法在MATLAB中的使用。
第一个例子是求解方程的根。
假设我们需要求解方程f(x)=0的根,其中f(x)是一个连续函数。
我们可以利用二分法来逼近方程的根。
首先,我们需要确定一个初始搜索范围[a, b],使得f(a)和f(b)的符号不同。
然后,我们可以使用二分法来逐步缩小搜索范围,直到找到一个近似的根。
第二个例子是查找有序列表中的某个元素。
假设我们有一个有序列表A,我们需要查找其中的某个元素x。
我们可以利用二分法来快速确定x是否在列表中,并返回其索引位置。
首先,我们需要确定初始搜索范围的左右边界。
然后,我们可以使用二分法来逐步缩小搜索范围,直到找到x或者确定x不存在于列表中。
二分法是一种常用的数值计算方法,在MATLAB中也有广泛的应用。
通过将搜索范围一分为二,二分法可以快速定位目标值,解决方程的根或者查找有序列表中的元素。
熟练掌握二分法的原理和应用,对于解决一些数值计算问题非常有帮助。
二分法matlab程序(推荐文档)

二分法二分法基本思路一般地,对于函数f(x),如果存在实数c,当x=c 时,若f(c)=0,那么把x=c 叫做函数f(x)的零点。
解方程即要求f(x)的所有零点。
假定f(x)在区间(x ,y )上连续先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假设f(a)<0,f(b)>0,a<b① 如果f[(a+b)/2]=0,该点就是零点,如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2>=a ,从①开始继续使用 ② 中点函数值判断。
如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b ,从①开始继续使用 中点函数值判断。
这样就可以不断接近零点。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。
另外,二分法不能计算复根和重根。
二分法步骤用二分法求方程()0f x =的根*x 的近似值k x 的步骤① 若对于a b <有()()0f a f b <,则在(,)a b 内()0f x =至少有一个根。
② 取,a b 的中点12a b x +=计算1()f x ③ 若1()0f x =则1x 是()0f x =的根,停止计算,运行后输出结果*1x x =若1()()0f a f x <则在1(,)a x 内()0f x =至少有一个根。
取111,a a b x ==;若1()()0f a f x >,则取111,a x b b ==;④ 若12k k b a ε-≤(ε为预先给定的要求精度)退出计算,运行后输出结果*2k k a b x +≈,反之,返回步骤1,重复步骤1,2,3 二分法Mtalab 程序syms x;fun=input('(输入函数形式)fx=');a=input('(输入二分法下限)a=');b=input('(输入二分法上限)b=');d=input('输入误差限 d=')%二分法求根%f=inline(x^2-4*x+4);%修改需要求解的inline 函数的函数体f=inline(fun);%修改需要求解的inline 函数的函数体e=b-a; k=0 ;while e>dc=(a+b)/2;if f(a)*f(c)<0b=c;elseif f(a)*f(c)>0a=c;elsea=c;b=cende=e/2; k=k+1;endx=(a+b)/2;x%x 为答案 k%k 为次数例题:用二分法计算方程4324100x x x -++=在(-2,2)内的实根的近似值,要求精度为0.0001解:(输入函数形式)fx=x^4-2*x^3+4*x+10(输入二分法下限)a=-2(输入二分法上限)b=2输入误差限 d=0.0001得到结果d =1.0000e-004x =2.0000k =16>>。
matlab二分法求根编程

matlab二分法求根编程MATLAB是一种强大的数学软件,它可以用于各种数学计算和数据分析。
其中,二分法求根是一种常见的数值计算方法,可以用于求解非线性方程的根。
在MATLAB中,我们可以使用二分法求根的函数fzero来实现这一过程。
二分法求根的基本思想是将非线性方程的根所在的区间不断缩小,直到找到根的近似值。
具体来说,我们可以先选取一个初始区间[a,b],然后计算出该区间的中点c=(a+b)/2,并计算出函数在c处的值f(c)。
如果f(c)的符号与f(a)相同,则根位于区间[c,b]中;否则,根位于区间[a,c]中。
我们可以不断重复这个过程,直到找到一个满足精度要求的根的近似值。
在MATLAB中,我们可以使用fzero函数来实现二分法求根。
该函数的基本语法为:x = fzero(fun,x0)其中,fun是一个函数句柄,表示需要求解的非线性方程;x0是一个初始值,表示我们需要在哪个点开始搜索根。
该函数会返回一个近似的根的值x。
下面是一个使用fzero函数实现二分法求根的例子:% 定义一个函数句柄,表示需要求解的非线性方程fun = @(x) x^3 - 2*x - 5;% 使用fzero函数求解该方程的根x = fzero(fun, [1, 2]);% 输出结果fprintf('The root of the equation is: %f\n', x);在这个例子中,我们定义了一个函数句柄fun,表示需要求解的非线性方程x^3 - 2*x - 5。
然后,我们使用fzero函数求解该方程的根,初始区间为[1,2]。
最后,我们输出求解得到的根的值。
总之,二分法求根是一种常见的数值计算方法,可以用于求解非线性方程的根。
在MATLAB中,我们可以使用fzero函数来实现这一过程。
通过合理地选择初始区间和精度要求,我们可以得到一个较为准确的根的近似值。
二分法及其matlab程序-经典

避免数值不稳定性
对于涉及大量计算或迭代的过程,要注意数值稳定性问题, 采取适当的算法或技巧,如使用稳定的算法、增加迭代次 数等。
利用MATLAB内置函数
二分法及其matlab程序-经典
目录
• 二分法基本原理 • MATLAB编程实现二分法 • 二分法在数值计算中应用举例 • MATLAB程序优化与改进策略 • 总结与展望
01
二分法基本原理
二分法定义与思想
定义
二分法是一种求解非线性方程近似根的有效算法,其基本思想是通过不断将区间一分为二,逐步缩小求解范围, 直到满足精度要求为止。
end
root = (a + b) / 2;
VS
关键代码片段展示
end
```
运行结果分析与讨论
• 假设我们要求解非线性方程f(x)=x^3-2x-5=0在 区间[2, 3]内的根,可以调用上述bisection函数进 行求解
运行结果分析与讨论
```matlab f = @(x) x^3 - 2*x - 5;
精度控制
当区间长度|b - a|小于给定 精度时,可取中点或任一端 点作为近似最优解。
求解矩阵特征值问题
• 特征多项式构建:对于n阶矩阵A,构建特征多项式f(λ) = |A - λI|。 • 初始区间选择:确定包含特征值的初始区间[a, b]。 • 二分迭代:取中点c = (a + b) / 2,计算f(c)。若f(c) == 0,则c为特征值;否则根据f(a)、f(b)、f(c)的大小关
缺点
二分法收敛速度较慢,需要多次迭代才能得 到精确解,且对于多峰函数或者复杂函数可 能无法找到全局最优解。
matlab编程实现二分法牛顿法黄金分割法最速下降matlab程序代码

用二分法求解4224min ()f t t t t =--115[,.]t ∈内的极小值点,要求准 1.function [t d]=erfenfa(a,b)k=1; %记录循环次数while abs(a-b)>0.0005c=(a+b)/2;C(k)=c; %存储每次循环中点c 的值if ff(c)<0a=c;endif ff(c)==0t1=c;break ;endif ff(c)>0b=c;endk=k+1;endt=(a+b)/2; %最终符合要求的值d=f(t); %最优解Ckfunction y=f(t)y=t^4-2*t^2-4*t;function y=ff(t)y=4*t^3-4*t-4;运行结果>> [t d]=erfenfa(1,1.5)C =Columns 1 through 91.2500 1.3750 1.3125 1.3438 1.3281 1.3203 1.3242 1.32621.3252Column 101.3247k =11t =1.3250d =-5.72902.黄金分割法 f (x)=x3-2x+1 初始区间[0, 3],收敛精度0.5function [t,f]=huangjinfenge(a,b)m=1-(sqrt(5)-1)/2;t2=a+m*(b-a)f2=g(t2);t1=a+b-t2f1=g(t1);while abs(t1-t2)>0.5if f1<f2a=t2;t2=t1f2=f1;t1=a+b-t2f1=g(t1);elseb=t1;t1=t2f1=f2;t2=a+m*(b-a)f2=g(t2);endendt=(t1+t2)/2;f=g(t);function y=g(t)y=t^3-2*t+1;运行结果> [t,f]=huangjinfenge(0,3)t2 =1.1459t1 =1.8541t1 =1.1459t2 =0.7082t =0.9271f =-0.0574>>3. 用牛顿法求解291min ()sin f x x x =--初始迭代点为x 0=0.4,要求准确到小数 点后第5位小数function [t1,d]=Newton(t0)t=t0-ff(t0)/fff(t0);k=1;%记录迭代次数T(1)=t;%存储迭代点while abs(t-t0)>0.000005t0=t;t=t0-ff(t)/fff(t);k=k+1;T(k)=t;endt1=t0;d=f(t1);kTfunction y=f(x)y=9*x^2-sin(x)-1;function y=ff(x)y=18*x-cos(x);function y=fff(x)y=18+sin(x);运行结果>> [t1,d]=Newton(0.4)k =3T =0.0586 0.0555 0.0555t1 =0.0555d =-1.0277>>4. 最速下降法验证课本上的例题求解291min ()sin f x x x =--初始迭代点为x 0=0.4, 要求准确到小数点后第5位小数function [G,g,X,F]=zuisu(X0)F(1)=f(X0);%存储x 点处的值G(:,1)=h(X0); %存储梯度向量g(1)=norm(G(:,1));%存储梯度模长X(:,1)=X0; %存储x 值A=[2,0;0,8];for j=1:2X(:,j+1)=X(:,j)-(G(:,j)'*G(:,j))/(G(:,j)'*A*G(:,j))*G(:,j); F(j+1)=f(X(:,j+1));G(:,j+1)=h(X(:,j+1));g(j+1)=norm(G(:,j+1));endif (G(:,2)'*G(:,1)<1E-10& G(:,3)'*G(:,2)<1E-10)disp(['相邻两搜索方向是正交的'])endfunction y=f(X)y=X(1)^2+4*X(2)^2;function n=h(X)n=[2*X(1),8*X(2)]';运行结果>> [G,g,X,F]=zuisu(X0)相邻两搜索方向是正交的G =2.0000 1.4769 0.2215 8.0000 -0.3692 0.8862g =8.2462 1.5224 0.9134X =1.0000 0.7385 0.1108 1.0000 -0.0462 0.1108F =5.0000 0.5538 0.0613 >>。
matlab二分法求解方程的根

matlab二分法求解方程的根
Matlab二分法是一种求解方程根的方法,也称作二分查找法。
它的原理是将区间不断缩小直至找到方程的根。
具体实现方法如下:
1. 定义一个区间[a,b],其中f(a)和f(b)异号;
2. 取区间中点c=(a+b)/2,计算f(c)的值;
3. 如果f(c)为0,则c就是方程的根;如果f(c)和f(a)同号,则根在区间[c,b]内,反之在[a,c]内;
4. 重复以上步骤,直至区间长度小于某个给定的阈值或者f(c)的值已经足够接近0。
在Matlab中实现二分法求解方程,可以按照以下步骤:
1. 定义函数f(x),表示要求解的方程;
2. 定义初始区间[a,b],并根据f(a)和f(b)的符号确定根的位置;
3. 循环进行二分查找,直至区间长度小于给定阈值或f(c)的值已经足够接近0,可以使用while语句实现;
4. 在循环中,每次计算中点c=(a+b)/2和f(c)的值,并根据f(c)和f(a)的符号确定新的区间;
5. 最终得到的c就是方程的根。
二分法在求解方程的根时具有较高的精度和可靠性,并且可以应用于大多数类型的方程求解。
在Matlab中,也可以通过内置函数fzero实现方程根的求解,但其实现原理是基于二分法的。
因此,掌
握二分法的实现方法可以更好地理解方程根求解的过程。
最新matlab迭代法代码

1、%用不动点迭代法求方程 x-e^x+4=0的正根与负根,误差限是10^-6% disp('不动点迭代法');n0=100;p0=-5;for i=1:n0p=exp(p0)-4;if abs(p-p0)<=10^(-6)if p<0disp('|p-p0|=')disp(abs(p-p0))disp('不动点迭代法求得方程的负根为:')disp(p);break;elsedisp('不动点迭代法无法求出方程的负根.')endelsep0=p;endendif i==n0disp(n0)disp('次不动点迭代后无法求出方程的负根')endp1=1.7;for i=1:n0pp=exp(p1)-4;if abs(pp-p1)<=10^(-6)if pp>0disp('|p-p1|=')disp(abs(pp-p1))disp('用不动点迭代法求得方程的正根为')disp(pp);elsedisp('用不动点迭代法无法求出方程的正根');endbreak;elsep1=pp;endendif i==n0disp(n0)disp('次不动点迭代后无法求出方程的正根')end2、%用牛顿法求方程 x-e^x+4=0的正根与负根,误差限是10^-6 disp('牛顿法')n0=80;p0=1;for i=1:n0p=p0-(p0-exp(p0)+4)/(1-exp(p0));if abs(p-p0)<=10^(-6)disp('|p-p0|=')disp(abs(p-p0))disp('用牛顿法求得方程的正根为')disp(p);break;elsep0=p;endendif i==n0disp(n0)disp('次牛顿迭代后无法求出方程的解')endp1=-3;for i=1:n0p=p1-(p1-exp(p1)+4)/(1-exp(p1));if abs(p-p1)<=10^(-6)disp('|p-p1|=')disp(abs(p-p1))disp('用牛顿法求得方程的负根为')disp(p);break;elsep1=p;endendif i==n0disp(n0)disp('次牛顿迭代后无法求出方程的解')end地理笔记初一·十班谷薪茹七年级地理(上)第一章让我们走进地理§1 我们身边的地理知识学习地理的意义:1、地理与日常生活息息相关:衣、食、住、行。
二分法matlab程序

班级
090712
学号
43
姓名
潘骁磊
实验室
3-128
设备编号 B01 日期 2012-6-5
实验题目 编写二分法方法的 MATLAB 主程序并验算书本 P-112(1)
1、实验目的:
通过编程实现二分法方法,加深对求根方法的理解。应用所编程序解决实际
算例。
2、实验要求:
(1)认真分析课题要求,复习相关理论知识,选择适当的解决方案;
2
2
[ a b ,b] .同理,若 2
f (a b) 0, 2
隔根区间变为
[a,
a
2
b
]
.将新区间记为
a1,
b1
.
(2)将 a1,b1重复上述步骤(1).得到一系列隔根区间:
a,b a1,b1 ak ,bk
并有 f (ak ) f (bk ) 0, x* (ak ,bk ) ,且后一区间的长度都是前一区间长度的一半,所以
ak ,bk
的长度为 bk
ak
ba 2k
,(k
)
,区间
ak , bk
的长度趋向于零,即这些区间最终
收缩于一点 x ,显然 x 就是方程 f (x) 0 的根。
(2)算法程序: %%%二分法主程序%% function erfen(f,a,b,m) t=b-a; f1=0; k=1; whi le(abs(t/2^(k+1))>=m)
命令窗口输入: f=@(x)x^4-3*x+1; a=0.3;b=0.4; m=0.005; erfen(f,a,b,m) 输出: k=
4 ans =
0.3438 x 的近似值为
matlab迭代法解方程的程序

文章标题:使用MATLAB迭代法解方程的程序目录1. 什么是迭代法解方程2. MATLAB中迭代法的实现3. 迭代法解方程的优缺点4. 实例分析:使用MATLAB实现迭代法解方程5. 结语1. 什么是迭代法解方程迭代法是一种数值计算方法,用于逼近方程的根或解。
在实际应用中,经常会遇到无法通过代数方法得到准确解的方程,这时候就需要借助数值计算的方法来求得近似解。
迭代法通过不断逼近解的过程,逐步缩小误差,最终得到一个接近精确解的近似值。
2. MATLAB中迭代法的实现MATLAB作为一种强大的数值计算工具,提供了丰富的数值计算函数和工具箱,其中包括了多种迭代法的实现。
在MATLAB中,常用的迭代法有牛顿法、雅各比迭代法、高斯-赛德尔迭代法等。
这些迭代法都可以通过调用MATLAB内置函数或自行编写程序实现。
在编写迭代法程序时,需要注意选择合适的迭代停止条件、初始化的迭代值、迭代步数等参数。
3. 迭代法解方程的优缺点迭代法解方程具有以下优点:1) 适用范围广:迭代法可以解决各种类型的方程,包括线性方程组、非线性方程、微分方程等;2) 可以得到近似解:即使方程无法通过代数方法求解,迭代法也可以得到一个接近精确解的近似值;3) 数值稳定性:在一定条件下,迭代法能够保证解的稳定性和收敛性。
但迭代法也存在一些缺点:1) 收敛速度慢:一些迭代法可能需要较多的迭代次数才能得到满意的解;2) 初始值敏感:迭代法对初始值的选取比较敏感,选取不当可能导致迭代发散或者收敛到错误的解;3) 复杂度高:一些迭代法的实现比较复杂,需要具备较高的数值计算和编程能力。
4. 实例分析:使用MATLAB实现迭代法解方程接下来,我们将以求解非线性方程x^2-3x+2=0为例,使用MATLAB实现迭代法来求得方程的根。
我们选择使用简单而经典的二分法来进行迭代计算。
```MATLABfunction result = iteration_method()f = @(x) x^2 - 3*x + 2;a = 0;b = 2;tol = 1e-6;if f(a)*f(b) > 0error('The function has the same sign at the endpoints.'); endwhile (b - a) > tolc = (a + b) / 2;if f(c) == 0break;elseif f(a)*f(c) < 0b = c;elsea = c;endresult = c;endend```上述代码中,我们通过定义函数f(x)为方程的表达式,并选择区间[a, b]为[0, 2]作为初始迭代区间。
二分法、简单迭代法的matlab代码实现

实验一非线性方程的数值解法(一)信息与计算科学金融崔振威201002034031一、实验目的:熟悉二分法和简单迭代法的算法实现。
二、实验内容:教材P40 2.1.5三、实验要求1 根据实验内容编写二分法和简单迭代法的算法实现2 简单比较分析两种算法的误差3 试构造不同的迭代格式,分析比较其收敛性(一)、二分法程序:function ef=bisect(fx,xa,xb,n,delta)% fx是由方程转化的关于x的函数,有fx=0。
% xa 解区间上限% xb 解区间下限% n 最多循环步数,防止死循环。
%delta 为允许误差x=xa;fa=eval(fx);x=xb;fb=eval(fx);disp(' [ n xa xb xc fc ]');for i=1:nxc=(xa+xb)/2;x=xc;fc=eval(fx);X=[i,xa,xb,xc,fc];disp(X),if fc*fa<0xb=xc;else xa=xc;endif (xb-xa)<delta,break,endend(二)、简单迭代法程序:function [x0,k]=iterate (f,x0,eps,N)if nargin<4N=500;endif nargin<3ep=1e-12;endx=x0;x0=x+2*eps;k=0;while abs(x-x0)>eps & k<Nx0=x;x=feval(f,x0);k=k+1;endx0=x;if k==Nend解:a、g(x)=x5-3x3-2x2+2二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[x^5-3*x^3-2*x^2+2]',[-3,3]);grid 得下图:由上图可得知:方程在[-3,3]区间有根。
(2)、二分法输出结果>> f='x^5-3*x^3-2*x^2+2'f =x^5-3*x^3-2*x^2+2>> bisect(f,-3,3,20,10^(-12))2.0000 -3.0000 0 -1.5000 0.03133.0000 -3.0000 -1.5000 -2.2500 -31.61824.0000 -2.2500 -1.5000 -1.8750 -8.43015.0000 -1.8750 -1.5000 -1.6875 -2.96326.0000 -1.6875 -1.5000 -1.5938 -1.21817.0000 -1.5938 -1.5000 -1.5469 -0.53828.0000 -1.5469 -1.5000 -1.5234 -0.24059.0000 -1.5234 -1.5000 -1.5117 -0.101510.0000 -1.5117 -1.5000 -1.5059 -0.034311.0000 -1.5059 -1.5000 -1.5029 -0.001412.0000 -1.5029 -1.5000 -1.5015 0.015013.0000 -1.5029 -1.5015 -1.5022 0.006814.0000 -1.5029 -1.5022 -1.5026 0.002715.0000 -1.5029 -1.5026 -1.5027 0.000716.0000 -1.5029 -1.5027 -1.5028 -0.000317.0000 -1.5028 -1.5027 -1.5028 0.000218.0000 -1.5028 -1.5028 -1.5028 -0.000119.0000 -1.5028 -1.5028 -1.5028 0.000120.0000 -1.5028 -1.5028 -1.5028 -0.00002、迭代法求方程:迭代法输出结果:>> f=inline('x^5-3*x^3-2*x^2+2');>> [x0,k]=iterate(fun1,2)x0 =2k =1>> [x0,k]=iterate(fun1,1.5)x0 =NaNk =6>> [x0,k]=iterate(fun1,2.5)x0 =NaNk =5(3)、误差分析:由二分法和迭代法输出结果可知,通过定点迭代法得出方程的解误差比二分法大,而利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。
matlab迭代法

matlab迭代法Matlab中,迭代法是一种求解数值方法的算法。
它是通过迭代近似计算来解决数值问题的方法。
下面我将详细介绍Matlab迭代法的原理、应用、优缺点及代码实现。
一、Matlab迭代法的原理Matlab迭代法是通过不断迭代来逼近目标解的方法。
它的基本思想是,把问题转化为不断迭代的公式,从一个初始点开始,一步一步不断逼近目标解。
因为迭代是逐步开始的,所以我们可以通过控制迭代次数来控制精度。
具体的迭代公式因问题而异,但其实现过程是类似的。
二、Matlab迭代法的应用1.求解非线性方程。
非线性方程的求解是很多问题的基础,而解非线性方程的迭代法在很多时候非常有用。
例如,求解多项式方程的实根、解微分方程等问题都可以通过迭代法来实现。
2.最优化问题。
最优化问题是指在一定约束条件下,寻找能够取得最小或者最大值的函数的解。
这个问题在现代科学和工程中有很广泛的应用,例如最小二乘、最小化成本等。
而要解决这类问题,就需要通过迭代来逐步逼近目标值。
3.求解线性方程组。
对于一些简单的线性方程组,例如二维或三维的线性方程组,可以用迭代法来求解。
这类问题的求解需要涉及到矩阵乘法、求逆等知识。
Matlab中内置了很多求解线性方程组的函数,例如linsolve等。
三、Matlab迭代法的优缺点优点:1.可以处理很多无法通过解析的方法求解的问题;2.算法灵活且易于实现。
缺点:1.需要设计正确的迭代公式,否则易产生发散现象;2.收敛速度较慢,需要耗费大量计算资源。
四、Matlab迭代法的代码实现在Matlab中,我们可以使用while循环和if语句来实现迭代法。
例如,对于求解非线性方程f(x)=0的问题,可以使用如下的代码实现:function x = iteration(f,x0)tol = 1e-6; % 设定收敛精度为1e-6iter = 1; % 设定迭代次数的初始值为1dx = 1; % 定义dx值为1while (abs(dx)>tol && iter<1000) % 当dx值与收敛精度的差值大于tol或者迭代次数超过1000次时,退出循环x = f(x0); % 计算迭代公式,求解x值dx = x - x0; % 计算dx值x0 = x; % 将x的值赋给x0,作为下一次迭代的初始值iter = iter + 1; % 迭代次数加1end以上是我对于Matlab迭代法的介绍,希望能够对你有所帮助。
matlab二分法求方程的近似解

题目:matlab二分法求方程的近似解一、概述由于许多实际问题都可以用方程来描述,而有些方程并不能通过代数方法求解,因此需要利用计算机进行数值计算。
二分法是一种简单而又常用的数值计算方法,通过不断缩小一个区间来逼近方程的根,从而获得方程的近似解。
本文将介绍如何使用matlab编程实现二分法求解方程的近似解,并给出示例代码和实际应用。
二、二分法求解方程的原理1. 什么是二分法二分法又称折半法,是一种在有序数组中查找特定值的搜索算法。
它的工作原理是不断将待查找的范围分成两半,然后确定待查找值可能存在的那一半。
通过不断缩小范围,最终找到目标值或确定目标值不存在。
2. 二分法求解方程的思想对于一个非线性方程f(x)=0,如果我们能够找到两个值a和b,使得f(a)和f(b)异号,那么在[a,b]区间内一定存在方程的根。
二分法的思想就是不断将[a,b]区间缩小,从而逼近方程的根。
三、使用matlab编程实现二分法求解方程1. 确定搜索区间需要确定方程的根存在的区间[a,b],并保证f(a)和f(b)异号。
这一步可以通过实际问题分析或者数值计算得到。
2. 定义求解函数在matlab中,需要定义方程f(x)的求解函数。
定义一个求解方程x^2-2的函数为:```matlabfunction y = func(x)y = x^2 - 2;end```3. 编写二分法求解程序在matlab中,编写二分法求解程序如下:```matlabfunction [result, iter] = binary_search(a, b, f, tol)fa = f(a);fb = f(b);if sign(fa) == sign(fb)error('f(a) and f(b) must have opposite signs');enditer = 0;while (b - a)/2 > tolc = (a + b)/2;fc = f(c);if fc == 0break;endif sign(fc) == sign(fa)a = c;fa = fc;elseb = c;fb = fc;enditer = iter + 1;endresult = (a + b)/2;end```四、示例代码及应用以方程x^2-2=0为例,使用上述编写的程序求解方程的近似解:```matlab[a, b] = [1, 2];tol = 1e-6;[result, iter] = binary_search(a, b, func, tol);fprintf('The approximate solution of x^2-2=0 is .6f, it takes d iterations\n', result, iter);```运行结果为:The approximate solution of x^2-2=0 is 1.xxx, it takes 20 iterations以上代码实现了对方程x^2-2=0近似解的求解,并且给出了迭代次数。
matlab迭代法代码

matlab迭代法代码matlab 迭代法代码1、%用不动点迭代法求方程x-e A x+4=0的正根与负根,误差限是10A-6% disp(' 不动点迭代法 ');n0=100;p0=-5;for i=1:n0p=exp(p0)-4;if abs(p-p0)<=10(6)if p<0disp('|p-p0|=')disp(abs(p-p0))disp(' 不动点迭代法求得方程的负根为 :')disp(p);break;elsedisp(' 不动点迭代法无法求出方程的负根 .')endelsep0=p;endendif i==n0 disp(n0) disp(' 次不动点迭代后无法求出方程的负根') endp1=1.7;for i=1:n0pp=exp(p1)-4;if abs(pp-p1)<=10(6)if pp>0disp('|p-p1|=')disp(abs(pp-p1))disp(' 用不动点迭代法求得方程的正根为 ')disp(pp);elsedisp(' 用不动点迭代法无法求出方程的正根 ');endbreak;elsep1=pp;endendif i==n0disp(n0)disp(' 次不动点迭代后无法求出方程的正根 ') end2、%用牛顿法求方程x-e A x+4=0的正根与负根,误差限是disp(' 牛顿法')n0=80;p0=1;for i=1:n0 p=p0-(p0-exp(p0)+4)/(1-exp(p0));if abs(p-p0)<=10(6)disp('|p-p0|=')disp(abs(p-p0))disp(' 用牛顿法求得方程的正根为 ')disp(p);break;elsep0=p;endendif i==n0disp(n0)disp(' 次牛顿迭代后无法求出方程的解p1=-3;for i=1:n0 p=p1-(p1-exp(p1)+4)/(1-exp(p1)); 10A-6') endif abs(p-p1)<=10A(-6) disp('|p-p1|=') disp(abs(p-p1)) disp(' 用牛顿法求得方程的负根为 ') disp(p); break; elsep1=p;endendif i==n0disp(n0)disp(' 次牛顿迭代后无法求出方程的解') end。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一非线性方程的数值解法(一)信息与计算科学金融崔振威201002034031一、实验目的:熟悉二分法和简单迭代法的算法实现。
二、实验内容:教材P40 2.1.5三、实验要求1根据实验内容编写二分法和简单迭代法的算法实现2简单比较分析两种算法的误差3试构造不同的迭代格式,分析比较其收敛性(一)、二分法程序:function ef=bisect(fx,xa,xb ,n, delta)% fx是由方程转化的关于x的函数,有fx=0。
% xa解区间上限% xb解区间下限% n最多循环步数,防止死循环。
%delta为允许误差x=xa;fa=eval(fx);x=xb;fb=eval(fx);disp(' [ n xa xb xc fc ]');for i=1: nxc=(xa+xb)/2;x=xc;fc=eval(fx);X=[i,xa,xb,xc,fc];disp(X),if fc*fa<0xb=xc;else xa=xc;endif (xb-xa)<delta,break,e ndend(二)、简单迭代法程序:fun ctio n [x0,k]=iterate (f,x0,eps,N)if nargin<4N=500;endif nargin<3ep=1e-12;endx=x0;x0=x+2*eps;k=0;while abs(x-xO)>eps & k<NxO=x;x=feval(f,xO);k=k+1;endx0=x;if k==Nend解:a、g(x)=x 5-3X3-2X2+2二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[x A5-3*x A3-2*x A2+2]',[-3,3]);grid 得下图:由上图可得知:方程在[-3,3]区间有根。
(2 )、二分法输出结果>> f='xA5-3*xA3-2*xA2+2' f =X A5-3*X A3-2*X A2+2>> bisect(f,-3,3,20,10A(-12))2.0000 -3.0000 0 -1.5000 0.03133.0000 -3.0000 -1.5000 -2.2500 -31.61824.0000 -2.2500 -1.5000 -1.8750 -8.43015.0000 -1.8750 -1.5000 -1.6875 -2.96326.0000 -1.6875 -1.5000 -1.5938 -1.21817.0000 -1.5938 -1.5000 -1.5469 -0.53828.0000 -1.5469 -1.5000 -1.5234 -0.24059.0000 -1.5234 -1.5000 -1.5117 -0.101510.0000 -1.5117 -1.5000 -1.5059 -0.034311.0000 -1.5059 -1.5000 -1.5029 -0.001412.0000 -1.5029 -1.5000 -1.5015 0.015013.0000 -1.5029 -1.5015 -1.5022 0.006814.0000 -1.5029 -1.5022 -1.5026 0.002715.0000 -1.5029 -1.5026 -1.5027 0.000716.0000 -1.5029 -1.5027 -1.5028 -0.000317.0000 -1.5028 -1.5027 -1.5028 0.000218.0000 -1.5028 -1.5028 -1.5028 -0.000119.0000 -1.5028 -1.5028 -1.5028 0.000120.0000 -1.5028 -1.5028 -1.5028 -0.00002、迭代法求方程:迭代法输出结果:>> f=inlin e('x A5-3*x A3-2*x A2+2');>> [xO,k]=iterate(fu n1,2)x0 =>> [xO,k]=iterate(fu n1,1.5) x0 =NaNk =6>> [xO,k]=iterate(fu n1,2.5) x0 =NaN k =5(3)、误差分析:由二分法和迭代法输出结果可知,通过定点迭代法得出方程的解误差比二分法大,而利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。
b、g(x)=cos(sin(x))二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[cos(si n(x))]',[-4,4]);grid得下图:由上图可得知:方程在[-4,4]区间无根。
(2 )、二分法输出结果>>f='cos(si n( x))'f = cos(s in( x))>> bisect(f,-4,4,20,10A(-12))2.0000 0 4.0000 2.0000 0.61433.0000 2.00004.0000 3.0000 0.99014.0000 3.0000 4.0000 3.5000 0.93915.0000 3.5000 4.0000 3.7500 0.84116.0000 3.7500 4.0000 3.8750 0.78427.0000 3.8750 4.0000 3.9375 0.75548.0000 3.9375 4.0000 3.9688 0.74129.0000 3.9688 4.0000 3.9844 0.734110.0000 3.9844 4.0000 3.9922 0.730511.0000 3.9922 4.0000 3.9961 0.728812.0000 3.9961 4.0000 3.9980 0.727913.0000 3.9980 4.0000 3.9990 0.727514.0000 3.9990 4.0000 3.9995 0.727315.0000 3.9995 4.0000 3.9998 0.727116.0000 3.9998 4.0000 3.9999 0.727117.0000 3.9999 4.0000 3.9999 0.727118.0000 3.9999 4.0000 4.0000 0.727019.0000 4.0000 4.0000 4.0000 0.727020.0000 4.0000 4.0000 4.0000 0.7270 2、迭代法求方程:迭代法输出结果:>> f=in li ne('cos(s in( x))');>> [x0,k]=iterate(f,0.5)x0 =0.7682k =15>> [xO,k]=iterate(f,1)x0 =0.7682k =15>> [x0,k]=iterate(f,1.5)x0 =0.7682k =16>> [x0,k]=iterate(f,2)x0 =0.7682k =15>> [x0,k]=iterate(f,2.5)x0 =0.7682k =14(3)、由于该方程无解,所以无法比较误差。
2c、g(x)=x -sin(x+0.15)二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot32-si n(x+0.15)]',[-10,10]);grid 得下图:(2 )、二分法输出结果>> f='x A2-si n(x+0.15)'x A2-s in( x+0.15)>> bisect(f,-3,3,30,10A(-12))1.0000 -3.00002.0000 -3.00003.0000 -1.50004.0000 -0.75005.0000 -0.37506.0000 -0.1875 3.0000 0 -0.14940 -1.5000 3.22570 -0.7500 1.12710 -0.3750 0.36370 -0.1875 0.07260 -0.0938 -0.04747.0000 -0.1875 -0.0938 -0.1406 0.01048.0000 -0.1406 -0.0938 -0.1172 -0.01919.0000 -0.1406 -0.1172 -0.1289 -0.004510.0000 -0.1406 -0.1289 -0.1348 0.002911.0000 -0.1348 -0.1289 -0.1318 -0.000812.0000 -0.1348 -0.1318 -0.1333 0.001113.0000 -0.1333 -0.1318 -0.1326 0.000114.0000 -0.1326 -0.1318 -0.1322 -0.0003 由上图可得知:方程在[-3,3]区间有根。
15.0000 -0.1326 -0.1322 -0.1324 -0.000116.0000 -0.1326 -0.1324 -0.1325 0.000017.0000 -0.1325 -0.1324 -0.1324 -0.000018.0000 -0.1325 -0.1324 -0.1325 -0.000019.0000 -0.1325 -0.1325 -0.1325 0.000020.0000 -0.1325 -0.1325 -0.1325 0.000021.0000 -0.1325 -0.1325 -0.1325 0.000022.0000 -0.1325 -0.1325 -0.1325 0.000023.0000 -0.1325 -0.1325 -0.1325 -0.000024.0000 -0.1325 -0.1325 -0.1325 0.000025.0000 -0.1325 -0.1325 -0.1325 -0.000026.0000 -0.1325 -0.1325 -0.1325 0.000027.0000 -0.1325 -0.1325 -0.1325 0.000028.0000 -0.1325 -0.1325 -0.1325 0.000029.0000 -0.1325 -0.1325 -0.1325 0.000030.0000 -0.1325 -0.1325 -0.1325 -0.00002、迭代法求方程:迭代法输出结果:>> f=i nlin e('x A2-si n(x+0.15)');>> [x0,k]=iterate(f,1.96)x0 =NaNk =12>> [x0,k]=iterate(f,0,2) x0 =-0.1494k =1>> [x0,k]=iterate(f,0.2) x0 =0.3234k =500>> [x0,k]=iterate(f,0.3) x0 =0.3234k =500>>[xO,k]=iterate(f,O.OO1)x0 =0.3234k =500(3)、误差分析:由二分法和迭代法输出结果可知,利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。