二分法、简单迭代法的matlab代码实现教学文案

合集下载

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计算方法迭代法牛顿法二分法实验报告

完美WORD格式姓名实验报告成绩评语:指导教师(签名)年月日说明:指导教师评分后,实验报告交院(系)办公室保存。

实验一 方程求根一、 实验目的用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。

并比较方法的优劣。

二、 实验原理 (1)、二分法对方程0)(=x f 在[a ,b]内求根。

将所给区间二分,在分点2a b x -=判断是否0)(=x f ;若是,则有根2a b x -=。

否则,继续判断是否0)()(<∙x f a f ,若是,则令x b =,否则令x a =。

否则令x a =。

重复此过程直至求出方程0)(=x f 在[a,b]中的近似根为止。

(2)、迭代法将方程0)(=x f 等价变换为x =ψ(x )形式,并建立相应的迭代公式=+1k x ψ(x )。

(3)、牛顿法若已知方程 的一个近似根0x ,则函数在点0x 附近可用一阶泰勒多项式))((')()(0001x x x f x f x p -+=来近似,因此方程0)(=x f 可近似表示为+)(0x f 0))(('0=-x x x f 设0)('0≠x f ,则=x -0x )(')(00x f x f 。

取x 作为原方程新的近似根1x ,然后将1x 作为0x 代入上式。

迭代公式为:=+1k x -0x )(')(k k x f x f 。

三、 实验设备:MATLAB 7.0软件四、 结果预测(1)11x =0.09033 (2)5x =0.09052 (3)2x =0,09052 五、 实验内容(1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不超过3105.0-⨯。

(2)、取初值00=x ,用迭代公式=+1k x -0x )(')(k k x f x f ,求方程0210=-+x e x的近似根。

要求误差不超过3105.0-⨯。

二分法及迭代法求解非线性方程根

二分法及迭代法求解非线性方程根

二分法及迭代法求解非线性方程根班级:姓名:方学号:日期:一、实验目的1、熟悉二分法及迭代法求解非线性方程根的数值算法;2、用matlab软件实现二分法及迭代法,掌握迭代法的收敛性和收敛速度问题及其加速方法;二、基本理论及背景1、牛顿迭代法具有平方收敛的速度,所以在迭代过程中只要迭代几次就会得到很精确的解。

这是牛顿迭代法比简单迭代法优越的地方,但是选定的初值要接近方程的解,否则有可能得不到收敛的结果,再者,牛顿迭代法计算量比较大。

因每次迭代除计算函数值外还要计算微商值。

2、牛顿迭代理论推导:设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y =f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。

过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。

重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值;3、参考《二分法求非线性方程根》,实现二分算法,完成下面的题目:求方程○1的根,精度至少达到10-6;比较迭代下列迭代法求解○1中方程根的收敛性:○2,;用牛顿法设计迭代函数求解○1中方程的根(精度至少达到10-6),并与○2中收敛的迭代法比较收敛的速度。

三、算法设计及实现1、设计:方程○1function f=fun1(x)f=exp(x)-x-3;;○2function y=Exp2(x)y=exp(x)-3;function y=Exp3(x)y=log(x+3);牛顿迭代:function df=Exp4(x)df=exp(x)-1。

四、实验步骤1、○1打开matlab软件,新建ErFen_Root.m文件,在窗口中编辑二分法数值积分函数程序代码,并保存在指定的文件夹下,在Current Directory窗口右边点击《Browse For Folder》按钮指向ErFen_Root.m文件;○2在Command Window中编辑相应要计算的题目的数值函数及相应的题目的表达式。

[matlab二分法程序代码]matlab牛顿迭代法程序代码

[matlab二分法程序代码]matlab牛顿迭代法程序代码

[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

二分法、牛頓迭代法求方程近似解在一些科學計算中常需要較為精確的數值解,本實驗基於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中,根据计算需求选择合适的数据类型,如双 精度(double)、单精度(single)或整数类型(int), 以避免不必要的精度损失。
避免数值不稳定性
对于涉及大量计算或迭代的过程,要注意数值稳定性问题, 采取适当的算法或技巧,如使用稳定的算法、增加迭代次 数等。
利用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)的大小关
缺点
二分法收敛速度较慢,需要多次迭代才能得 到精确解,且对于多峰函数或者复杂函数可 能无法找到全局最优解。

MATL新编计算方法迭代法牛顿法二分法实验报告

MATL新编计算方法迭代法牛顿法二分法实验报告

M A T L新编计算方法迭代法牛顿法二分法实验报告 Prepared on 22 November 2020姓名 实验报告成绩评语:指导教师(签名)年 月 日说明:指导教师评分后,实验报告交院(系)办公室保存。

实验一 方程求根一、 实验目的用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。

并比较方法的优劣。

二、 实验原理(1)、二分法对方程0)(=x f 在[a ,b]内求根。

将所给区间二分,在分点2a b x -=判断是否0)(=x f ;若是,则有根2ab x -=。

否则,继续判断是否0)()(<•x f a f ,若是,则令x b =,否则令x a =。

否则令x a =。

重复此过程直至求出方程0)(=x f 在[a,b]中的近似根为止。

(2)、迭代法将方程0)(=x f 等价变换为x =ψ(x )形式,并建立相应的迭代公式=+1k x ψ(x )。

(3)、牛顿法若已知方程 的一个近似根0x ,则函数在点0x 附近可用一阶泰勒多项式))((')()(0001x x x f x f x p -+=来近似,因此方程0)(=x f 可近似表示为+)(0x f 0))(('0=-x x x f 设0)('0≠x f ,则=x -0x )(')(00x f x f 。

取x 作为原方程新的近似根1x ,然后将1x 作为0x 代入上式。

迭代公式为:=+1k x -0x )(')(k k x f x f 。

三、 实验设备:MATLAB 软件四、 结果预测 (1)11x = (2)5x = (3)2x =0,09052五、 实验内容(1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不超过3105.0-⨯。

(2)、取初值00=x ,用迭代公式=+1k x -0x )(')(k k x f x f ,求方程0210=-+x e x 的近似根。

MATLAB数值分析实验四(雅各比、高斯赛德尔迭代,以及二分法和牛顿迭代解非线性方程)

MATLAB数值分析实验四(雅各比、高斯赛德尔迭代,以及二分法和牛顿迭代解非线性方程)

佛山科学技术学院实 验 报 告课程名称 数值分析实验项目 迭代法专业班级 机械工程 姓 名 余红杰 学 号 2111505010指导教师 陈剑 成 绩 日 期 月 日一. 实验目的1、 在计算机上用Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组 。

2、 在计算机上用二分法和Newton 迭代法求非线性方程 的根。

二. 实验要求1、按照题目要求完成实验内容;2、写出相应的Matlab 程序;3、给出实验结果(可以用表格展示实验结果);4、分析和讨论实验结果并提出可能的优化实验。

5、写出实验报告。

三. 实验步骤1、用Matlab 编写Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组Ax b =的程序。

2、用Matlab 编写二分法和Newton 法求非线性方程()0f x =的根程序。

3、设⎪⎪⎪⎭⎫ ⎝⎛--=212120203A ,T b )1,3,1(=,对于线性方程组b Ax =,考虑如下问题: (1)分别写出Jacobi 迭代矩阵和Gauss-Seidel 迭代矩阵(2)用Jacobi 迭代法和Gauss-Seidel 迭代法解该方程时,是否收敛?谁收敛的更快?(3)用实验步骤1编好的两种迭代法程序进行实验,通过数值结果验证(2)的结论。

4、用调试好的二分法和Newton 迭代法程序解决如下问题求020sin 35=-+-x x e x 的根,其中控制精度810-=eps ,最大迭代次数50=M 。

四. 实验结果1.%Jacob.mfunction [x,B] = Jacob(A,b,n)%Jacobi迭代求解方程组Ax=b,系数矩阵A,迭代次数n%求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);J = D^(-1)*(L+U);B = J;f = D^(-1)*b;%初始化x即启动值:x = zeros(m,1);%根据x(k+1)=Jx(k)+f进行矩阵运算:for i=1:nx = J*x + f;end%GauSeid.mfunction [x,G] = GauSeid(A,b,n)%Gauss-Seidel迭代求解方程组Ax=b,系数矩阵A,迭代次数n %求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);G = inv(D-L)*U;f = inv(D-L)*b;%初始化矩阵:%根据x(k+1)=Gx(k)+f进行矩阵运算:x = zeros(m,1);for i = 1:nx = G*x + f;end2.%Dichotomy.mfunction x=Dichotomy(x1,x2,p,n)%利用二分法求根,区间[x1,x2]%p为精度a = x1;b = x2;%进行n次二分:%第一个条件判断根在a,b区间内%第二个条件判断是否中间点就是根,是则迭代终止;%第三个条件判断二分后根在中点左侧还是右侧;%第四个条件判断精度是否达标,用区间长度代替for i=1:nif f(a)*f(b)<0x0 = (a+b)/2;p0 = (b-a)/(2^i);if f(x0)==0x = x0;elseif f(a)*f(x0)<0b = x0;else a= x0;endendendif p0>pcontinue;elsex = x0;break;endend%NewIterat.mfunction x=NewIterat(x0,p,n)%利用牛顿迭代法求根;%x0为启动点,估计的靠近根的值,p为精度,n为迭代次数;syms x1;%设置一个自变量x1,方便后面的求导:f1 = diff(f(x1));%进行n次迭代,精度达标会提前终止;%第一个判断是根据控制条件来确定真实误差是选绝对还是相对误差;%第二个判断是确定精度是否满足要求for i=1:nx1 = x0;x = x0-f(x0)/eval(f1);if x<1RealDiv = abs(x-x0);else RealDiv = abs(x-x0)/abs(x); endif RealDiv>px0 = x;else break;endend3.run43.mclc,clear;A = [3 0 -2;0 2 1;-2 1 2];b = [1;3;1];n1 = 50;n2 =100;%输入A,b矩阵,设置迭代次数为50次;%调用迭代函数,返回迭代矩阵;[x,B] = Jacob(A,b,n1);xj50 = x;f1 = max(abs(eig(B)))%显示谱半径,确定收敛性;[x,B] = GauSeid(A,b,n1);xg50 = x;f2 = max(abs(eig(B)))%谱半径;xj100 = Jacob(A,b,n2);xg100 = GauSeid(A,b,n2); Jacobi= [xj50,xj100]%对比迭代50次和100次的结果GauSei= [xg50,xg100]%很容易看出准确解为[1;1;1]4.f.mfunction y = f(x)%所有f(x)=0中f(x)函数;y = exp(5*x)-sin(x)+x^3-20; 下页是具体解时的程序:%run44.mclc,clear;%很容易看出在[0,1]间有解;x = Dichotomy(0,1,10^(-8),50)x = NewIterat(0,10^(-8),50)五. 讨论分析4.3实验中的迭代矩阵在上个部分,分别为J 和G ;对于收敛性,看下图中的f1,f2,也就是迭代矩阵的谱半径,都是小于1的,但是可以看出后者的谱半径更小,就是说它的收敛速度更快;最终求x 的值,每种迭代方法分别迭代50次(第一列)和100次(第二列); 实际值为[1;1;1]可以看出用高斯赛德尔迭代更精确,速度更快。

二分法、简单迭代法的matlab代码实现

二分法、简单迭代法的matlab代码实现

二分法、简单迭代法的 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 xbxc 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,end end(二)、简单迭代法程序: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)=x 5-3x3-2x2+2二分法求方程:(1)、在 matlab 的命令窗口中输入命令:>>fplot('[x^5-3*x^3-2*x^2+2]',[-3,3]);grid得下图:由上图可得知:方程在[-3,3] 区间有根。

MATLAB计算方法迭代法牛顿法二分法实验报告

MATLAB计算方法迭代法牛顿法二分法实验报告

MATLAB计算方法迭代法牛顿法二分法实验报告实验目的:本实验旨在通过MATLAB编程实现迭代法、牛顿法和二分法,并通过实例验证其准确性和收敛速度。

实验原理:迭代法是一种通过不断迭代逼近根的方法,其基本原理是选择一个初始值,然后通过迭代公式不断逼近根的值,直到满足给定的精度要求。

牛顿法是一种通过不断迭代求函数的零点的方法,其基本原理是通过当前点的切线与x轴的交点来逼近根的值,直到满足给定的精度要求。

二分法是一种通过不断将区间一分为二来逼近根的方法,其基本原理是通过判断根是否落在区间的两个端点之间,然后将区间一分为二,直到满足给定的精度要求。

实验步骤:1.编写迭代法的MATLAB代码,实现对给定函数的根的逼近。

2.编写牛顿法的MATLAB代码,实现对给定函数的根的逼近。

3.编写二分法的MATLAB代码,实现对给定函数的根的逼近。

4.针对不同的函数,分别使用迭代法、牛顿法和二分法进行根的逼近,并记录每种方法的迭代次数和逼近结果。

5.对比三种方法的迭代次数和逼近结果,分析其准确性和收敛速度。

实验结果:以求解方程x^3-2x-5=0为例,使用迭代法、牛顿法和二分法进行根的逼近。

迭代法:迭代公式:x(n+1)=(2x(n)+5)^(1/3)初始值:x(0)=2迭代次数:6逼近结果:2.0946牛顿法:初始值:x(0)=2迭代次数:4逼近结果:2.0946二分法:初始区间:[1,3]迭代次数:11逼近结果:2.0946实验结论:通过对比三种方法的迭代次数和逼近结果可以发现,迭代法和牛顿法的收敛速度都要快于二分法,并且迭代法和牛顿法的逼近结果也更为接近真实根。

这是因为迭代法和牛顿法都是通过不断逼近根的值来求解,而二分法则是通过将区间一分为二来逼近根的值,所以迭代法和牛顿法的收敛速度更快。

总结:本实验通过MATLAB编程实现了迭代法、牛顿法和二分法,并通过实例验证了它们的准确性和收敛速度。

实验结果表明,迭代法和牛顿法在求解根的过程中具有更快的收敛速度和更接近真实根的逼近结果,而二分法的收敛速度较慢。

二分法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>>欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。

牛顿迭代法与二分法1

牛顿迭代法与二分法1

用二分法和牛顿迭代法编程一. 实验课题用二分法和牛顿迭代法编程求方程sinx-x²/2=0的实根,要求误差不超过0.00001。

输出迭代次数,初始值和根的近似值;再构造不同的迭代函数,用迭代法求解,并进行比较。

二. 实验步骤(一) 用matlab作函数y=sinx-x²/2的图,步骤如下:先作一个名为fun1.m的 M文件function y1=fun1(x)y1=sinx-x²/2;接着使用下列命令在区间[-0.5,2]上作该函数的图象,并估计y1=0时x的根的大致区间。

x=-0.5:0.01:2;plot (x,fun1(x),‘b’)hold onplot(x,zeros(size(x)))hold offgrid由图象的结果观察可知:上述方程在(1,1.5)上有一实根。

(二)用二分法求方程的近似根由|b-a|/(2^(n+1))≤ε可以得到n≥13,故预定最大计算次数为15次。

作一个名为fun2.m的M文件,步骤如下:function X=fun2(a,b)n=15; ε=0.01; k=1; X=(a+b)/12;while fabs(a-b)≥εif fun1(X)==0;breakendif fun1(a)*fun1(X)<0; b=X;else a=X;endk=k+1;if k>n,k, error(‘fail’)else X=(a+b)/2;endend[‘Iterative times=’,int2str(k)]在命令窗口输入命令:r=fun2(1,1.5)运行后得到结果为:ans=Iterative times=13 r=1.4408(三)用牛顿迭代法求方程的近似根具体步骤如下:1. 选择迭代函数φ(x)=x-f(x)/f’(x)。

2.选定初始值x0与x1,并算出相应的f(x0)与f(x1),并保证迭代算出的x1比x0更接近所求的根。

二分法的matlab运用

二分法的matlab运用

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

数值方法实验班级:2011级数师一班学生姓名:雷宗玲学生学号:4011指导老师:李梦实验时间: 2014年5月30日中文摘要 (II)1引言 (1)2二分法的基本原理 (1)2.1 概述 (1)2.2 二分法的matlab基本程序 (2)2.2.1 实验步骤 (2)2.2.2 matlab的原程序 (3)3二分法的运用 (4)3.1 在实际生活中的运用 (4)3.2 在中学教学中的运用 (4)3.2.1 利用“二分法”思想巧证不等式 (4)3.2.2 利用“二分法”思想巧证一元二次方程根的分布 (5)3.2.3 利用“二分法”思想巧求最值 (6)3.3 在求解方程中的运用 (6)总结 (7)参考文献 (8)摘要:二分法无论在实际生活中,还是在科学上,都占有十分重要的地位。

在实际生活中,通常用来检查电路、水管等等,这是二分法最简单、最本质的一个应用。

在中学教学中,可以用二分法来巧证不等式、一元二次方程根的分布、求最值等等。

在求解n次多项式方程的根时,我们也可以利用二分法讨论一般方程式()0=f的实数根。

本文主要概述二分法的基本思想,并从以上几个方面,x对二分法在实际生活或科学上的应用论述,以便在以后的学习过程中得以广泛的应用。

关键词:查电路;证不等式;根的分布;求最值;求解1 引言在实际问题中,我们经常会遇到求非线性方程(代数方程或超越方程)根的问题。

对n 次多项式方程,由代数学基本定理知它有n 个根(含复数根,重根按重数计)。

而方程f(x)是多项式或超越函数(又分为代数方程或超越方程)。

对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。

因此,如何求得满足一定精度要求的方程的近似根,也就成为了我们迫切需要解决的问题。

近年来,随着数学科学研究的不断进展,又更新了许多方程求解的方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,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)、误差分析:由二分法和迭代法输出结果可知,通过定点迭代法得出方程的解误差比二分法大,而利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。

b、g(x)=cos(sin(x))二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[cos(sin(x))]',[-4,4]);grid得下图:由上图可得知:方程在[-4,4]区间无根。

(2)、二分法输出结果>>f='cos(sin(x))'f =cos(sin(x))>> bisect(f,-4,4,20,10^(-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=inline('cos(sin(x))');>> [x0,k]=iterate(f,0.5)x0 =0.7682k =15>> [x0,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)、由于该方程无解,所以无法比较误差。

c、g(x)=x2-sin(x+0.15)二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[x^2-sin(x+0.15)]',[-10,10]);grid 得下图:由上图可得知:方程在[-3,3]区间有根。

(2)、二分法输出结果>> f='x^2-sin(x+0.15)'f =x^2-sin(x+0.15)>> bisect(f,-3,3,30,10^(-12))1.0000 -3.0000 3.0000 0 -0.14942.0000 -3.0000 0 -1.5000 3.22573.0000 -1.5000 0 -0.7500 1.12714.0000 -0.7500 0 -0.3750 0.36375.0000 -0.3750 0 -0.1875 0.07266.0000 -0.1875 0 -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.000315.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=inline('x^2-sin(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>> [x0,k]=iterate(f,0.001)x0 =0.3234k =500(3)、误差分析:由二分法和迭代法输出结果可知,利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。

相关文档
最新文档