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

合集下载

matlab二分法

matlab二分法

matlab二分法MATLAB二分法是一种常用的求解非线性方程的数值解法,它通过不断地将定义域分成若干个子区间,从而找到近似解。

与梯形法和牛顿迭代法相比,MATLAB 二分法又称为“分治法”,是一种简单、直观、快速和有效的求解非线性方程的数值解法。

1. 二分法原理MATLAB 二分法是根据“分而治之”的思想来求解非线性方程的数值解的。

它的基本思想是,将定义域分成两个子区间,其中一个子区间的函数值的符号一定是固定的,另一个子区间的函数值的符号也是固定的,只有当它们的符号相反时,才能确定解存在于这两个子区间之间。

然后,再对缩小的子区间重复以上操作,进而确定非线性方程的近似解,也就是所谓的“黄金分割法”。

2. MATLAB 二分法的步骤(1)始条件首先,要将定义域分成两个子区间,在每一个子区间内,假定函数值的符号是固定的;确定迭代初值 $x_0,比如$x_0=0.5;(2)代计算求出迭代第二值 $x_1,即 $x_1=x_0+frac{b-x_0}{2},计算出$x_1$值,计算函数值的符号;(3)晕条件当求得的函数值的符号与定义域中一边的函数值的符号相反时,认为解存在于此子区间之间,继续将所取得的子区间继续缩小,直到定义域中的某两个端点接近,或者函数值的绝对值小于指定的误差范围,此时称为收敛;(4)的输出将收敛时的根 $x_n$ 作为解的输出。

3. MATLAB 二分法的优缺点(1) MATLAB 二分法的优点MATLAB 二分法具有简单、直观、快速和有效的特点,只要能够确定函数在定义域中的一边的函数值的符号,就可以求出近似解。

(2) MATLAB 二分法的缺点MATLAB 二分法容易收敛到局部极小值,而无法收敛到全局最优值;同时,它也不适用于函数值在定义域内不连续或周期变化的情况。

4. MATLAB 二分法的应用MATLAB 二分法在实际工程中广泛应用,主要用于求解非线性方程、解决二次规划问题、求解非线性最小化问题、结构优化问题等。

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

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

二分法及迭代法求解非线性方程根班级:姓名:方学号:日期:一、实验目的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中编辑相应要计算的题目的数值函数及相应的题目的表达式。

数值分析课程实验报告-二分法和牛顿迭代法

数值分析课程实验报告-二分法和牛顿迭代法
《数值分析》课程实验报告
用二分法和牛顿迭代法求方程的根
算法名称用二分法和牛顿迭代法求方程的根
学科专业机械工程
作者姓名xxxxxx
作者学号xxxBiblioteka xx作者班级xxxxxxxx
xx大学
二〇一五年十二月
《数值分析》课程实验报告
实验名称
用二分法和牛顿迭代法求方程的根
成绩
一、问题背景
在科学研究与工程计算中,常遇到方程(组)求根问题。若干个世纪以来,工程师和数学家花了大量时用于探索求解方程(组),研究各种各样的方程求解方法。对于方程f(x)=0,当f(x)为线性函数时,称f(x)=0为线性方程;当f(x)为非线性函数时,称式f(x)=0为非线性方程。对于线性方程(组)的求解,理论与数值求法的成果丰富;对于非线性方程的求解,由于f(x)的多样性,尚无一般的解析解法。当f(x)为非线性函数时,若f(x)=0无解析解,但如果对任意的精度要求,设计迭代方程,数值计算出方程的近似解,则可以认为求根的计算问题已经解决,至少能够满足实际要求。
fx=subs(ff,x,xk);
fa=subs(ff,x,a);
k=k+1;
iffx==0
y(k)=xk;
break;
elseiffa*fx<0
b=xk;
else
a=xk;
end
y(k)=xk;
end
plot(y,'.-');
gridon
(2)牛顿迭代法程序:
functionx=newton(xx,n)
对二分法和牛顿迭代法的观察和分析我们可以知道,二分法的优点是方法比较简单,编程比较容易,只是二分法只能用于求方程的近似根,不能用于求方程的复根,且收敛速度慢。而牛顿迭代法的收敛速度明显大于二分法的速度。

二分法、牛顿迭代法、普通迭代法

二分法、牛顿迭代法、普通迭代法

数值球根试验报告《数值计算方法》专业班级软件08-1姓名熊文成学号08083117时间2010年10月24日星期天一、 实验目的熟悉二分法以及牛顿迭代法求方程近似根的数值方法,掌握各种迭代方法,自己扩张研究迭代法的效率与收敛性和初始值的关系。

二、 实验内容1.已知0104)(23=-+=x x x f 在[]21,上有一个实根*x ,14)2(5)1(=-=f f ,,用二分法和牛顿迭代法求该实根,要求精度满足条件:321*1021-+⨯≤-k x x 。

2.条件允许的话,扩展研究各种迭代法的效率,以及迭代的效率和收敛性与初始值的关系,并通过比较采用两点加速的方法与普通的方法的效率体验加速迭代的优点。

总而言之,本实验中的用到的求根方法有①二分法,②牛顿迭代法,③迭代函数为213)10(21)(x x -=ϕ的迭代方法,以及④对函数213)10(21)(x x -=ϕ采用两点加速迭代的方法。

三、 主函数流程程序是按顺序运行的,流程图如下图所示:四、源程序#include <stdio.h>#include <conio.h>#include <math.h>//根据x的值计算函数值//函数f(x)=x*x*x+4*x*x-10double func(double x){double value;value=x*x*x+4*x*x-10;return value;}//根据参数x的值计算函数f(x)的导数值double divFunc(double x){return 3*x*x+8*x;}//二分法计算方程f(x)=0在[1,2]上的跟//二份迭代结束条件由参数precision精度给出void biSectionMethod(double precision){int k=0; //均分次数double x1=1.0,x2=2.0; //区间[1.0,2.0]double midx; //二分之后的值printf("\n\t k 有根区间k+1 f(x(k+1)) ");do{printf("\n\t%3d",k);printf(" [%.3f,%.3f]",x1,x2);midx=(x1+x2)/2;printf(" %f",midx);printf(" %.6f",func(midx));if (func(midx)<0)x1=midx;else x2=midx;k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>=precision); //区间的长度超过5e-3就一直迭代printf("\n\t二分法分区间的次数:%d,所求的根是:%lf",k-1,x2);}//牛顿迭代法//根据初值值x0,在区间[1.0,2.0]上迭代求根//迭代次数由参数precision精度决定void NewTonMethod(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=x2-func(x1)/divFunc(x1);if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t牛顿迭代初值:%lf,次数:%d,所求的根是:%lf",x0,k-1,x2); }//迭代函数g(x)=(sqrt(10-x*x*x))/2;double funcTwo(double x){return (sqrt(10-x*x*x))/2;}//普通迭代函数void ordinaMethod(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=funcTwo(x1);if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t普通迭代初值:%lf,次数:%d,所求的根是:%lf",x0,k-1,x2); }//使用两个跌代值的组合加速跌代//对迭代函数f(x)=(sqrt(10-x*x*x))/2的加速void twoValue(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=(funcTwo(x1)+x1)/2;if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t两点加速迭代初值:%lf,次数:%d,根:%lf",x0,k,x2);}void main(){double orgin=1.5; //初始值double precision=5e-6; //精度char sel=0; //操作符while(1){printf("\n\t选择:");printf("\n\t1.二分法\n\t2.迭代法\n\t");sel=getch();printf("\n\n\t注:程序停止处按任意键继续");if (sel=='1'){printf("\n\n\t ************二分法求解过程***********");biSectionMethod(precision); //测试函数}else{printf("\n\t输入迭代的初值:");scanf("%lf",&orgin);//if (orgin>2.0||orgin<1.0) //限制迭代初值范围,根据情况决定//orgin=1.5; //如果输入非法,则按1.5计算printf("\n\n\t ************牛顿迭代法求解过程************");NewTonMethod(orgin,precision);printf("\n\t任何键继续:");getch();printf("\n\n\t *******普通迭代g(x)=(sqrt(10-x*x*x))/2*****");ordinaMethod(orgin,precision);printf("\n\t任何键继续:");getch();printf("\n\n\t ************两个值组合加速迭代x=(g(x)+x)/2***********");twoValue(orgin,precision);}printf("\n\t任何键继续:");getch();}}五、运行结果1、选择求根方法2、 选择二分法下面给出二分法的结果:3、 选择迭代法查看结果:首先显示的是牛顿迭代法的结果:然后是普通迭代法函数是:213)10(21)(x x -=ϕ,结果如下:接着可以看到的是用两点加速法对函数213)10(21)(x x -=ϕ的加速:下面采用不同的初值查看普通迭代函数的收敛性与效率: 各个结果如下:上图对应的是收敛性:收敛的。

[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;/*** 首先在程序第一次运行的时候,构建出棋盘,切以后* 不能再从新构建,知道结束,所以将其放到静态代码块中。

非线性方程线性化

非线性方程线性化
7
1.0066 err = 0.0066 k= 5 y= 1.3270e-004 p1 = 1.0033 err = 0.0033 k= 6 y= 3.3211e-005 p1 = 1.0017 err = 0.0017 k= 7 y= 8.3074e-006 p1 = 1.0008 err = 8.3157e-004 k= 8 y= 2.0774e-006 p1 = 1.0004 err = 4.1596e-004 k= 9 y= 5.1943e-007 p1 = 1.0002 err = 2.0802e-004 k= 10 y=
3
6
function y=f(x); y=x^3-3*x+2; 再用 M-文件写一个名为 df.m 的文件定义函数的微商 df ( x) 3x 2 3 。 function y=df(x) y=3*x^2-3; 然后再 MATLAB 的命令窗口输入: newton('f','df',1.2,10^(-6),10) 结果为: p0 = 1.2000 ans = 0.1280 p1 = 1.1030 err = 0.0970 k= 1 y= 0.0329 p1 = 1.0524 err = 0.0507 k= 2 y= 0.0084 p1 = 1.0264 err = 0.0260 k= 3 y= 0.0021 p1 = 1.0133 err = 0.0131 k= 4 y= 5.2963e-004 p1 =
二:实验内容所需的基本知识
二分法的原理:
设 f ( x) 在 [a, b] 上 连 续 , 且 f (a) f (b) 0 。 则 [a, b] 为 方 程 区 间 ( 设 只 有 唯 一 根 ) 。 取中 点

matlab中的迭代算法

matlab中的迭代算法

matlab中的迭代算法Matlab中的迭代算法迭代算法是一种通过重复应用某个过程或规则来解决问题的方法。

在Matlab中,迭代算法广泛应用于数值计算、优化问题、图像处理等领域。

本文将介绍几种常见的迭代算法,并通过实例来演示其应用。

一、二分法二分法是一种简单而有效的迭代算法,用于求解函数的根。

其基本思想是通过将区间逐渐缩小,不断逼近根的位置。

具体步骤如下:1. 选择一个初始区间[a, b],使得f(a)和f(b)异号;2. 计算区间的中点c=(a+b)/2;3. 判断f(c)的符号,并更新区间的边界;4. 重复步骤2和3,直到满足精度要求。

二分法的优点是简单易懂,但收敛速度相对较慢。

以下是一个使用二分法求解方程x^2-2=0的示例代码:```matlaba = 1;b = 2;tol = 1e-6;while abs(b-a) > tolc = (a + b) / 2;if (c^2 - 2) * (a^2 - 2) < 0b = c;elsea = c;endendroot = (a + b) / 2;disp(root);```二、牛顿法牛顿法是一种迭代算法,用于求解非线性方程和最优化问题。

其基本思想是通过利用函数的局部线性近似,逐步逼近根或最优解。

具体步骤如下:1. 选择一个初始点x0;2. 计算函数f在点x0处的导数f'(x0);3. 计算切线方程的解,即x1 = x0 - f(x0)/f'(x0);4. 重复步骤2和3,直到满足精度要求。

牛顿法的优点是收敛速度快,但对初始点的选择较为敏感。

以下是一个使用牛顿法求解方程x^2-2=0的示例代码:```matlabx0 = 1;tol = 1e-6;while abs(x1 - x0) > tolx1 = x0 - (x0^2 - 2) / (2 * x0);x0 = x1;endroot = x1;disp(root);```三、迭代法求解线性方程组迭代法也可以用于求解线性方程组Ax=b。

Newton迭代法数值分析实验报告

Newton迭代法数值分析实验报告

数值分析实验报告x=0.5;y=x-exp(-x);z=x-y/(1+exp(-x));k=1;while abs(z-x)>=1.0e-8 k=k+1;x=z;y=x-exp(-x);z=x-y/(1+exp(-x));endk如图所示结果为下图2、用Newton 切线法求方程310x x --=在1.5附近的一个根.主要代码:clear; x=1.5; y=x^3-x-1; z=x-y/(3*x^2-1); k=1;while abs(z-x)>=1.0e-8 k=k+1; x=z; y=x^3-x-1; z=x-y/(3*x^2-1); end k z 如图所示结果为下图3、用Newton 切线法计算3k =,4k =时,方程2(2)(3)0k x x --=在1.3附近的根(2)以及2.5附近的根(3)K=3时在1.3附近的根主要代码:clear;x=1.3;y=(x-sqrt(2))^3*(x^2-3);m=3*(x^2 - 3)*(x - 2^(1/2))^2 + 2*x*(x - 2^(1/2))^3; z=x-y/m;k=1;while abs(z-x)>=1.0e-8k=k+1;x=z;y=(x-sqrt(2))^3*(x^2-3);m=3*(x^2 - 3)*(x - 2^(1/2))^2 + 2*x*(x - 2^(1/2))^3;z=x-y/m;endk结果为下图K=4时在1.3附近的根主要代码结果为下图K=4时在2.5附近的根主要代码clear;x=2.5;y=(x-sqrt(2))^4*(x^2-3);m= 4*(x^2 - 3)*(x - 2^(1/2))^3 + 2*x*(x - 2^(1/2))^4; z=x-y/m;k=1;while abs(z-x)>=1.0e-5k=k+1;x=z;y=(x-sqrt(2))^4*(x^2-3);m= 4*(x^2 - 3)*(x - 2^(1/2))^3 + 2*x*(x - 2^(1/2))^4; z=x-y/m;endkz结果为下图K=3时在2.5附近的根主要代码结果为下图四、调试和运行程序过程中产生的问题及采取的措施:1、编译时,想用diff求出y的一阶导数,但出现错误,必须把x变成syms形式,编译过程出现错误,就采取把y的一阶导数先算出来,带入newton迭代公式中,程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

完美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 的近似根,要求误差不
超过
3
105.0-⨯。

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

近似根。

要求误差不超过3
105.0-⨯。

(3)、取初值0
0=x ,用牛顿迭代法求方程0210=-+x e x
的近似根。

要求误
差不超过
3
105.0-⨯。

六、 实验步骤与实验程序 (1) 二分法
第一步:在MATLAB 7.0软件,建立一个实现二分法的MATLAB 函数文件agui_bisect.m 如下:
function x=agui_bisect(fname,a,b,e) %fname 为函数名,a,b 为区间端点,e 为精度 fa=feval(fname,a); %把a 端点代入函数,求fa fb=feval(fname,b); %把b 端点代入函数,求fb if fa*fb>0 error('两端函数值为同号'); end
%如果fa*fb>0,则输出两端函数值为同号 k=0 x=(a+b)/2
while(b-a)>(2*e) %循环条件的限制
fx=feval(fname,x);%把x代入代入函数,求fx
if fa*fx<0%如果fa与fx同号,则把x赋给b,把fx赋给fb
b=x;
fb=fx;
else
%如果fa与fx异号,则把x赋给a,把fx赋给fa
a=x;
fa=fx;
end
k=k+1
%计算二分了多少次
x=(a+b)/2 %当满足了一定精度后,跳出循环,每次二分,都得新的区间断点a和b,则近似解为x=(a+b)/2
end
第二步:在MATLAB命令窗口求解方程f(x)=e^x+10x-2=0,即输入如下>>fun=inline('exp(x)+10*x-2')
>> x=agui_bisect(fun,0,1,0.5*10^-3)
第三步:得到计算结果,且计算结果为
(2) 迭代法
第一步:第一步:在MATLAB 7.0软件,建立一个实现迭代法的MATLAB 函数文件agui_main.m 如下: function x=agui_main(fname,x0,e)
%fname 为函数名dfname 的函数fname 的导数, x0为迭代初值 %e 为精度,N 为最大迭代次数(默认为100) N=100;
x=x0; %把x0赋给x ,再算x+2*e 赋给x0
x0=x+2*e;
k=0;
while abs(x0-x)>e&k<N %循环条件的控制:x0-x的绝对值大于某一精度,和迭代次数小于N
k=k+1 %显示迭代的第几次
x0=x;
x=(2-exp(x0))/10 %迭代公式
disp(x)%显示x
end
if k==N warning('已达到最大迭代次数');end %如果K=N则输出已达到最大迭代次数
第二步:在MATLAB命令窗口求解方程f(x)=e^x+10x-2=0,即输入如下>>fun=inline('exp(x)+10*x-2')
>> x=agui_main(fun,0,1,0.5*10^-3)
第三步:得出计算结果,且计算结果为
以下是结果的屏幕截图
(3) 牛顿迭代法
第一步:第一步:在MATLAB 7.0软件,建立一个实现牛顿迭代法的MATLAB 函数文件=agui_newton.m 如下: function x=agui_newton(fname,dfname,x0,e)
%fname为函数名dfname的函数fname的导数, x0为迭代初值
%e为精度,N为最大迭代次数(默认为100)
N=100;
x=x0; %把x0赋给x,再算x+2*e赋给x0
x0=x+2*e;
k=0;
while abs(x0-x)>e&k<N %循环条件的控制:x0-x的绝对值大于某一精度,和迭代次数小于N
k=k+1 %显示迭代的第几次
x0=x;
x=x0-feval(fname,x0)/feval(dfname,x0);%牛顿迭代公式
disp(x)%显示x
end
if k==N warning('已达到最大迭代次数');end %如果K=N则输出已达到最大迭代次数
第二步:在MATLAB命令窗口求解方程f(x)=e^x+10x-2=0,即输入如下>>fun=inline('exp(x)+10*x-2')
>> dfun=inline('exp(x)+10')
>> x=agui_newton(fun,dfun,0,0.5*10^-3)
第三步:得出结果,且结果为
以下是结果的屏幕截图
七、实验结果
(1)11x=0.09033 (2)5x=0.09052 (3)2x=0,09052
八、实验分析与结论
由上面的对二分法、迭代法、牛顿法三种方法的三次实验结果,我们可以得出这样的结论:二分法要循环k=11次,迭代法要迭代k=5次,牛
顿法要迭代k=2次才能达到精度为3105.0-⨯的要求,而且方程0
210=-+x e x 的精确解经计算,为0.0905250, 计算量从大到小依次是:二分法,迭代法,牛顿法。

由此可知,牛顿法和迭代法的精确度要优越于二分法。

而这三种方法中,牛顿法不仅计算量少,而且精确度高。

从而可知牛顿迭代法收敛速度明显加快。

可是迭代法是局部收敛的,其收敛性与初值x0有关。

二分法收敛虽然是速度最慢,但也有自己的优势,可常用于求精度不高的近似根。

迭代法是逐次逼近的方法,原理简单,但存在收敛性和收敛速度的问题。

对与不同的题目,可以从三种方法的优缺点考虑用哪一种方法比较好。

相关文档
最新文档