Newton分形的原理及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-⨯。
MATLAB程序(牛顿法及线形方程组)
MATLAB 程序1、图示牛顿迭代法(M 文件)文件名:newt_gfunction x = new_g(f_name,x0,xmin,xmax,n_points)clf,hold off% newton_method with graphic illustrationdel_x = 0.001;wid_x = xmax - xmin; dx = (xmax - xmin)/n_points;xp = xmin:dx:xmax; yp = feval(f_name,xp);plot(xp,yp);xlabel('x');ylabel('f(x)');title('newton iteration'),hold onymin = min(yp); ymax = max(yp); wid_y = ymax-ymin;yp = 0. * xp; plot(xp,yp)x = x0; xb = x+999; n=0;while abs(x-xb) > 0.000001if n > 300 break; endy=feval(f_name,x); plot([x,x],[y,0]);plot(x,0,'o')fprintf(' n = % 3.0f, x = % 12.5e, y = % 12.5e \ n', n, x, y);xsc = (x-xmin)/wid_x;if n < 4, text(x,wid_y/20,[num2str(n)]), endy_driv = (feval(f_name,x + del_x) - y)/del_x;xb = x;x = xb - y/y_driv; n = n+1;plot([xb,x],[y,0])endplot([x x],[0.05 * wid_y 0.2 * wid_y])text( x, 0.2 * wid_y, 'final solution')plot([ x ( x - wid_x * 0.004)], [0.01 * wid_y 0.09 * wid_y])plot([ x ( x + wid_x * 0.004)], [0.01 * wid_y 0.09 * wid_y])传热问题假设一个火炉是用厚度为0.05m 的砖单层砌成的。
matlab牛顿拉夫逊法与快速分解法的实现
一、概述MATLAB是一种强大的数学软件工具,它提供了许多优秀的数值计算和数据分析功能。
其中,牛顿拉夫逊法和快速分解法是两种常用的数值计算方法,它们在解决非线性方程组和矩阵分解等问题中具有重要的应用价值。
本文将介绍如何在MATLAB中实现这两种方法,并对它们的优缺点进行详细分析。
二、牛顿拉夫逊法的实现1. 算法原理牛顿拉夫逊法是一种用于求解非线性方程组的迭代算法。
它利用函数的一阶和二阶导数信息来不断逼近方程组的解,直到满足精度要求为止。
算法原理可以用以下公式表示:公式1其中,x表示解向量,F(x)表示方程组的函数向量,J(x)表示方程组的雅可比矩阵,δx表示解的更新量。
通过不断迭代更新x,最终得到方程组的解。
2. MATLAB代码实现在MATLAB中,可以通过编写函数来实现牛顿拉夫逊法。
以下是一个简单的示例代码:在这段代码中,首先定义了方程组的函数向量和雅可比矩阵,然后利用牛顿拉夫逊法进行迭代更新,直到满足精度要求为止。
通过这种方式,就可以在MATLAB中实现牛顿拉夫逊法,并应用于各种实际问题。
三、快速分解法的实现1. 算法原理快速分解法是一种用于矩阵分解的高效算法。
它利用矩阵的特定性质,通过分解为更小的子问题来加速计算过程。
算法原理可以用以下公式表示:公式2其中,A表示要分解的矩阵,L和U分别表示矩阵的下三角和上三角分解。
通过这种分解方式,可以将原始矩阵的计算量大大减小,提高求解效率。
2. MATLAB代码实现在MATLAB中,可以利用内置函数来实现快速分解法。
以下是一个简单的示例代码:在这段代码中,利用MATLAB内置的lu函数进行LU分解,得到矩阵的下三角和上三角分解。
通过这种方式,就可以在MATLAB中实现快速分解法,并应用于各种矩阵计算问题。
四、方法比较与分析1. 算法复杂度牛顿拉夫逊法和快速分解法在计算复杂度上有所不同。
牛顿拉夫逊法的迭代次数取决于所求解问题的非线性程度,通常需要较多的迭代次数。
matlab编程实现二分法牛顿法黄金分割法最速下降matlab程序代码
matlab编程实现二分法牛顿法黄金分割法最速下降matlab程序代码二分法(Bisection Method)是一种寻找函数零点的数值计算方法。
该方法的基本思想是:首先确定一个区间[a, b],使得函数在这个区间的两个端点处的函数值异号,然后将区间逐步缩小,直到找到一个区间[a', b'],使得函数在这个区间的中点处的函数值接近于零。
以下是使用MATLAB实现二分法的示例代码:```matlabfunction [x, iter] = bisection(f, a, b, tol)fa = f(a);fb = f(b);if sign(fa) == sign(fb)error('The function has the same sign at the endpoints of the interval');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;endx=(a+b)/2;end```牛顿法(Newton's Method)是一种用于寻找函数零点的数值计算方法。
该方法的基本思想是:通过迭代来逼近函数的零点,每次迭代通过函数的切线来确定下一个近似值,直到满足收敛条件。
以下是使用MATLAB实现牛顿法的示例代码:```matlabfunction [x, iter] = newton(f, df, x0, tol)iter = 0;while abs(f(x0)) > tolx0 = x0 - f(x0) / df(x0);iter = iter + 1;endx=x0;end```黄金分割法(Golden Section Method)是一种用于寻找函数极值点的数值计算方法。
newton迭代matlab代码_概述及解释说明
newton迭代matlab代码概述及解释说明1. 引言1.1 概述本文将介绍并详细解释Newton迭代算法在MATLAB中的代码实现。
Newton 迭代算法是一种用于求解方程根和优化问题的数值迭代算法,其基本原理是通过不断逼近函数的零点或最小值点来获得解。
本文将从算法的概述、原理介绍、迭代过程以及算法适用性分析等方面对Newton迭代算法进行全面的阐述。
1.2 文章结构文章将按照以下顺序展开对Newton迭代算法的讲解和说明:- 引言:对本文的主题和内容进行简要介绍,并给出文章的结构安排。
- Newton迭代算法概述:包括原理介绍、迭代过程和算法适用性分析三个部分,对Newton迭代算法的基本概念和应用领域进行阐述。
- MATLAB代码实现解释说明:详细说明了使用MATLAB编写Newton迭代算法代码的背景信息和相关工具介绍,然后逐步解释代码实现的步骤,并通过示例与结果分析来更好地理解代码部分。
- 应用案例和拓展讨论:通过具体案例一(求解方程根)和案例二(系统优化问题求解)来展示Newton迭代算法的实际应用,并在拓展讨论部分探讨改进Newton迭代算法的研究方向和方法。
- 结论与展望:对整篇文章进行总结回顾,并展望未来更高效、更准确的数值迭代算法发展趋势。
1.3 目的本文的目的是通过对Newton迭代算法在MATLAB中代码实现的详细解释,帮助读者更好地理解该算法的原理和应用,并提供相应的代码示例和结果分析。
同时,通过应用案例和拓展讨论,引发读者对于改进Newton迭代算法及其未来发展方向的思考。
通过阅读本文,读者可以具备一定程度上运用Newton迭代算法解决实际问题的能力,并对当前数值迭代算法领域的研究方向有一定了解。
2. Newton迭代算法概述:2.1 原理介绍:Newton迭代算法是一种用于数值逼近解的迭代方法,可以用于求解非线性方程的根、优化问题等。
该算法基于牛顿-拉弗森方法,其基本思想是通过不断逼近函数曲线上的某点来寻找函数零点或极值点。
[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编写二分法和Newton迭代法求解非线性函数
⽤Matlab编写⼆分法和Newton迭代法求解⾮线性函数1、⼆分法原理:若f的值在C[a, b]中,且f (a) · f (b) < 0,则f在 (a, b) 上必有⼀根。
实现算法流程:2、Newton迭代法迭代公式:⼏何意义:3、求解问题⽤Newton法和⼆分法求的解。
4、代码实现1 clear;close;clc2 a=0;b=1;%根区间3 e=10^(-6);%根的容许误差4 [X , N]=dichotomy(e,a,b);%⼆分法5 p0=0.5;%初始值6 N=15;%迭代次数7 [X1]=Newdon(p0,e,N);%Newton迭代法89 function [X , N]=dichotomy(deta,a,b)10 % 函数dichotomy:⼆分法11 %输⼊值:12 %fun:⽅程函数13 %deta:根的容许误差14 %有根区间:[a,b]15 %输出值16 %X:求解到的⽅程的根17 %N:总的迭代次数18 N=1+fix(log2((b-a)/deta));%由公式7.2求得,取整数|X_N-X*|<=(b-a)/2^N<deta,求N19 n=1;20 f1=myfunction(a);21 f2=myfunction(b);22if (f1*f2>0)23 disp('根不在输⼊的区间⾥,请重新输⼊区间');24else25while n <= N26 x=(a+b)/2;27if myfunction(a)*myfunction(x)>028 a=x;29else30 b=x;31 end32 n=n+1;33 end34 X=x;35 fprintf('第%d次⼆分法求出的⽅程的根:\n',N);36 fprintf('X=\n');37 disp(X);38 end39 end4041 function [P]=Newdon(p0,TOL,N)42 %求⽅程组的解43 %输⼊参数44 %初始值:p045 %误差容限:TOL46 %最⼤迭代次数:N47 %输出参数:48 %⽅程近似解:p49 %或失败信息“Method failed”50 format long;51 n=1;%初始迭代次数52 syms x;53while n<=N54if abs(subs(diff(myfunction(x)),x,p0))<TOL55 P=p0;56break;57else58if subs(diff(myfunction(x),2),x,p0)==059 disp('Method failed');60break;61else62 p=p0-myfunction(p0)/subs(diff(myfunction(x)),x,p0);63 p=eval(p);%将exp的值转为⼩数值64if(abs(p-p0)<TOL)65 P=p;66break;67else68 p0=p;69 end70 end71 end72 n=n+1;73 end74 % P=vpa(P,10);%将分数转为⼩数并保留8位⼩数75 fprintf('第%d次NeWton迭代法求出的⽅程的根:\n',N);76 fprintf('P=\n');77 disp(P);78 end7980 function f=myfunction(x)81 f=x*exp(x)-1;82 end5、求解结果。
非线性方程组求解的牛顿迭代法用MATLAB实现
****1. 二元函数的newton 迭代法理论分析设),(y x f z =在点),(00y x 的某一邻域内连续且有直到2阶的连续偏导数,),(00h y h x ++为该邻域内任意一点,则有⎥⎦⎤⎢⎣⎡∂∂+∂∂+≈++==00),(),(),(),(0000y y x x y x f y k y x f xh y x f k y h x f 其中 0x x h -=,0y -=y k 于是方程0),(=y x f 可近似表示为0),(),(),(k =⎥⎦⎤⎢⎣⎡∂∂+∂∂+==k k y y x x k y x f y k y x f x h y x f 即 0),()(),()(),(y k =-+-+k k k k k x k k y x f y y y x f x x y x f同理,设y)g(x,z =在点),(00y x 的某一邻域内连续且有直到2阶的连续偏导数,),(00h y h x ++为该邻域内任意一点,亦有⎥⎦⎤⎢⎣⎡∂∂+∂∂+≈++==00),(),(),(),(0000y y x x y x g y k y x g x h y x g k y h x g其中0x x h -=,0y -=y k 于是方程0),(g =y x 可近似表示为0),(),(),(k =⎥⎦⎤⎢⎣⎡∂∂+∂∂+==k k y y x x k y x g y k y x g x h y x g 即 0),(g )(),()(),(y k =-+-+k k k k k x k k y x y y y x g x x y x g于是得到方程组⎩⎨⎧=-+-+=-+-+0),(g )(),()(),(0),()(),()(),(y k y k k k k k k x k k k k k k k x k k y x y y y x g x x y x g y x f y y y x f x x y x f****求解这个方程组,当0),(),(),(),(≠-k k y k k x k k y k k x y x g y x f y x f y x g 时),(),(),(),(),(),(),(),(k k y k k x k k y k k x k k y k k k k y k k k y x g y x f y x f y x g y x f y x g y x g y x f x x --+=),(),(),(),(),(),(),(),(y k k y k k x k k y k k x k k x k k k k x k k k y x g y x f y x f y x g y x g y x f y x f y x g y --+=从而⎪⎪⎩⎪⎪⎨⎧--+=--+=),(),(),(),(),(),(),(),(y ),(),(),(),(),(),(),(),(k k y k k x k k y k k x k k x k k k k x k k k k k y k k x k k y k k x k k y k k k k y k k k y x g y x f y x f y x g y x g y x f y x f y x g y y x g y x f y x f y x g y x f y x g y x g y x f x x (1) 记符号),(),(),(),(g ),(k k x k k k k x k k y x x x y x g y x f y x f y x g fg f k k -=- ),(),(),(),(),(k k y k k k k y k k y x yy y x f y x g y x g y x f gf fg k k -=-),(),(),(),(),(k k y k k x k k y k k x y x y x y x y x g y x f y x f y x g g f f g k k -=-于是(1)式可改写为⎪⎪⎩⎪⎪⎨⎧--+=--+=),(),(),(),(g k k k k k k k k y x y x y x y x x x k y x y x y x y x y y k g f f g fg f y y g f f g gf fg x x (2)迭代公式为:⎪⎪⎩⎪⎪⎨⎧--+=--+=++),(),(1),(),(1k g k k k k k k k k y x y x y x y x x x k k y x y x y x y x y y k gf fg fg f y yg f f g gf fg x x (3) 通过迭代公式(3)可以迭代出当 ,2,1=k 时,),(k k y x 的值,当δ≤++)1,1(yk xk (0>δ为给定的误差控制项)时,原方程组的根即为),(k k y x 。
牛顿法matlab程序及例题
牛顿法matlab程序及例题牛顿法是一种求解非线性方程组的常用方法,它的基本思想是通过迭代逐步逼近方程组的根。
在matlab中,可以通过编写相应的程序来实现牛顿法,并且可以通过一些例题来深入理解其应用。
下面是一份牛顿法的matlab程序:function [x, fval, exitflag, output] = mynewton(fun, x0, tol, maxiter)% fun:非线性方程组的函数句柄% x0:初始点% tol:允许误差% maxiter:最大迭代次数x = x0;fval = feval(fun, x);iter = 0;output = [];while norm(fval) > tol && iter < maxiteriter = iter + 1;J = myjacobian(fun, x);dx = - J fval;x = x + dx;fval = feval(fun, x);output = [output; [x', norm(fval)]];endif norm(fval) <= tolexitflag = 0; % 成功求解elseexitflag = 1; % 未能求解end% 计算雅可比矩阵function J = myjacobian(fun, x)n = length(x);fval = feval(fun, x);J = zeros(n);h = sqrt(eps); % 微小的增量for j = 1:nxj = x(j);x(j) = xj + h;fval1 = feval(fun, x);x(j) = xj - h;fval2 = feval(fun, x);x(j) = xj;J(:, j) = (fval1 - fval2) / (2 * h);end接下来,我们可以通过一个例题来演示牛顿法的应用。
最优化理论与算法------牛顿法(附Matlab实现):
最优化理论与算法------⽜顿法(附Matlab 实现):1、写在最前:在此只是简单在应⽤层⾯说明⼀下相关算法,严谨的数学知识,请⼤家参考最下⾯参考书⽬,后期有精⼒会进⾏细化,先占个坑。
2、基本知识::f (x )=10!f x 0+11!x −x 0f ′x 0+12!x −x 02f ′′x 0+⋯+1n !x −x 0n f (n )x 0+R n⽜顿法的基本思想是,在极⼩点附件⽤⼆阶 Taylor 多项式:f (x )=10!f x 0+11!x −x 0f ′x 0+12!x −x 02f ′′x 0近似⽬标函数f (x ),进⽽求出极⼩点的估计值。
⽜顿法实现的动图如下所⽰:为了便于以下讨论时符号的统⼀,重写公式(2)如下所⽰:φ(x )=f x (k )+f ′x (k )x −x (k )+12f ′′x (k )x −x (k )2对(3)式求导:φ′(x )=f ′x (k )+f ′′x (k )x −x (k )=0令(4)式为0,既可以得到切线与x 轴交点:x (k +1)=x (k )−f ′x (k )f ′′x (k )由此可以得到⼀系类的x (k ),逐渐逼近真实最⼩值。
3、程序框图:4、算例:求 min f (x )=4x 21+x 22−x 21x 2初始点:x A =(1,1)T ,精度要求:ε=10−3f (x )=4x 21+x 22−x 21x 2∇f (x )=8x 1−2x 1x 2,2x 2−x 21T∇2f (x )=8−2x 2−2x 1−2x 12进⾏迭代计算:5、Matlab 求解(调试环境2016a ):如算例4要求所⽰:求得:x =[−0.1586×e −4,−0.1631×e −4]T result =1.2719e −6结果与⼿算的吻合。
全套下载链接:包含⽂档、PPT 、Matlab 源代码等等:6、优缺点:优点:•Newton 法产⽣的点列x k 若收敛,则收敛速度快,具有⾄少⼆阶收敛速率•Newton 法具有⼆次终⽌性缺点:•可能会出现在某步迭代时,⽬标函数值上升()()()()()()()()()()()()()()()()()()()()()()()()Processing math: 100%•当初始点远离极⼩点时,⽜顿法产⽣的点列可能不收敛,或者收敛到鞍点,或者Hesse矩阵不可逆,⽆法计算•需要计算Hesse矩阵的逆矩阵,计算量⼤7、参考:最优化理论与算法(第⼆版)陈宝林编著最优化理论Matlab。
matlab牛顿迭代 程序 -回复
matlab牛顿迭代程序-回复牛顿迭代方法是一种数值逼近的方法,用于求解非线性方程和优化问题。
它通过不断迭代逼近目标函数的根或极值点,以提高计算的准确性和效率。
首先,我们需要了解什么是非线性方程。
在数学中,非线性方程指的是形如f(x) = 0的方程,其中f(x)是一个非线性函数,x是未知数。
相对于线性方程,非线性方程的求解更加复杂,无法使用简单的代数方法求解。
而牛顿迭代方法可以用来解决非线性方程。
它基于以下思想:通过不断逼近目标函数的根,可以找到一个接近于真实解的近似解。
具体来说,牛顿迭代方法使用一阶泰勒展开式来逼近目标函数,然后用逼近的线性函数求解近似根,将这个近似根代入原函数中,再次计算线性函数,一直重复这个过程直到满足收敛条件。
下面我们来介绍一下牛顿迭代的基本原理和步骤。
假设要求解的非线性方程为f(x) = 0。
1. 选择初始点x0。
初始点的选择对于迭代的收敛性和速度非常重要。
2. 构造迭代公式。
牛顿迭代方法的迭代公式为:xn+1 = xn -f(xn)/f'(xn)。
其中,xn是第n次迭代得到的近似解,f'(xn)是f(x)的导数在点xn处的值。
3. 计算迭代。
根据迭代公式,将第n次迭代得到的近似解xn代入公式中,计算得到第n+1次迭代的近似解xn+1。
4. 判断收敛。
判断迭代是否达到了预设的精度要求。
可以选择一个相对误差或绝对误差作为判断标准,当近似解的变化小于一定阈值时,认为迭代收敛,即找到了近似解。
5. 如果迭代还未收敛,返回第3步,继续迭代计算。
需要注意的是,牛顿迭代可能会出现迭代发散的情况。
通常情况下,在正常迭代过程中,迭代会愈发接近最终的解。
然而,当目标函数的导数在某些点附近接近于零或者不连续时,迭代可能会发散。
这种情况下,我们需要选择一个更好的初始点或考虑其他数值逼近方法来解决。
牛顿迭代方法的优点是收敛速度快,但缺点是对初值敏感,并且需要计算目标函数的导数。
牛顿法matlab程序及例题
牛顿法matlab程序及例题牛顿法是一种求解非线性方程和优化问题的常用方法。
它利用函数的一阶和二阶导数信息来不断逼近函数的零点或极值点。
在MATLAB 中,可以用fzero函数实现非线性方程的求解,用fminunc函数实现优化问题的求解。
以下是一个简单的牛顿法的MATLAB程序示例:function [x, fx, n] = newton(f, df, x0, tol, max_iter) % f: 目标函数% df: 目标函数的一阶导数% x0: 初值% tol: 精度要求% max_iter: 最大迭代次数n = 0;while n < max_iterfx = f(x0);dfx = df(x0);if abs(dfx) < 1e-9error('牛顿法失败:一阶导数过小');endx = x0 - fx / dfx;if abs(x - x0) < tolreturn;endx0 = x;n = n + 1;enderror('牛顿法失败:达到最大迭代次数');下面是一个例题,通过牛顿法求解方程sin(x) = x / 2:f = @(x) sin(x) - x / 2;df = @(x) cos(x) - 1 / 2;[x, fx, n] = newton(f, df, 1, 1e-9, 100);fprintf('解:%.16f,函数值:%.16f,迭代次数:%d', x, fx, n);运行结果为:解:0.0000000000000000,函数值:0.0000000000000000,迭代次数:4可以看到,牛顿法很快就找到了方程的一个根。
需要注意的是,牛顿法可能会失败,特别是在一阶导数过小或初值离根太远的情况下。
因此,使用时需要谨慎,并进行必要的检查和处理。
牛顿法matlab程序及例题
牛顿法matlab程序及例题牛顿法是一种求解非线性方程的优秀方法,其基本思想是利用切线逼近非线性方程的根,逐步逼近准确解。
下面我们介绍牛顿法的matlab程序及例题。
【程序】function [x_iter,k]=newton(f,df,x0,tol,maxit)%牛顿法%输入:f-目标函数,df-目标函数的导函数,x0-初始值,tol-误差限,maxit-最大迭代次数%输出:x_iter-迭代结果,k-迭代次数k=0;x_iter=x0;err=tol+1;while(err>tol && k<maxit)x=x_iter;x_iter=x-f(x)/df(x);err=abs(x_iter-x);k=k+1;endif(k==maxit)fprintf('未收敛');elsefprintf('迭代次数:%d',k);end【例题】example:求解非线性方程f(x)=x^3-5x^2+3x+7=0,初始值为x0=2,精度为1e-6。
解法:首先求导得df(x)=3x^2-10x+3,然后代入程序:>> f=@(x)x^3-5*x^2+3*x+7;>> df=@(x)3*x^2-10*x+3;>> [x_iter,k]=newton(f,df,2,1e-6,100);>> x_iterans =4.3793>> kk =5故该非线性方程的根为x=4.3793,迭代次数为5次。
【总结】通过以上例题,我们可以发现牛顿法是一种十分有效的求解非线性方程的方法,其程序简洁高效,对于复杂的非线性方程求解也能得到较好的结果。
因此在实际应用中,我们可以采用牛顿法来求解非线性方程,提高计算效率和精度。
(完整word版)牛顿法的MATLAB实现
牛顿法的MATLAB实现摘要:性能学习是神经网络中的一类很重要的学习规则,其旨在找到一个最优点来提高网络的性能。
牛顿法是一种基于二阶泰勒级数的算法,逐步迭代来实现进一步的极小化,最后找到最优点。
本文采用MATLAB 编程来实现牛顿法,并通过具体的例子进行分析计算。
关键字:牛顿法;MATLABRealise Newton’s Method by using MatlabAbstract: Performance learning is one of important learning rules in neural network ,which aims to find an optimal point to improve the performance of neural network.Newton's method is a kind of algorithm which based on second-order Taylor series, the iteration step by step to achieve further minimization, and finally find the most advantage.In this paper,by using the matlab, Newton's method is easily to realize and it also gives a demonstration to analyse and calculation.Key words: Newton’s method; MATLAB0 引言神经网络作为一门新兴的学科,在短短的数十年内已经被运用于多种学科领域,大量的有关神经网络机理、模型以及算法分析等方面的文章如雨后春笋般涌现。
MATLAB是一种强大的工程计算和仿真软件,其基本上可以实现神经网络的各种设计方法和算法。
matlab中newton法和割线法
Newton法(也称为牛顿-拉普森法)和割线法都是数值计算中用于求解方程根的迭代方法。
以下是它们在MATLAB中的基本实现:
Newton法
Newton法基于函数的导数和二阶导数进行迭代,其迭代公式为:
x n+1=x n−f(x n) f′(x n)
其中,f(x)是要求解的方程,f′(x)是f(x)的导数。
MATLAB代码示例:
割线法
割线法使用两个近似值x n和x n−1来估计导数,其迭代公式为:
x n+1=x n−f(x n)(x n−x n−1) f(x n)−f(x n−1)
MATLAB代码示例:
在这两个方法中,你需要提供方程f(x)及其导数(对于Newton法),或者提供初始近似值x0和x1(对于割线法)。
容差tol用于控制迭代的停止条件。
最大迭代次数max_iter用于避免无限循环。
这些方法都是迭代方法,其收敛性和速度受到初始值的选择和方程的性质影响。
在实际使用中,需要谨慎选择初始值以及检查迭代是否收敛。
matlab 牛顿迭代法 微分方程 边界平衡点
matlab 牛顿迭代法微分方程边界平衡点《深入探讨MATLAB中的牛顿迭代法及其在微分方程和边界平衡点中的应用》MATLAB作为一种强大的科学计算软件,在工程、数学和科学等领域中有着广泛的应用。
其中,牛顿迭代法作为一种高效的数值计算方法,在微分方程和边界平衡点的求解中有着重要的作用。
1. 牛顿迭代法(Newton's Method)牛顿迭代法是一种使用局部线性逼近来不断逼近函数零点的迭代方法。
它的基本思想是通过不断求解切线与横坐标轴的交点来逼近函数的零点,从而得到函数的根。
其迭代公式为:\[x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\]2. MATLAB中的牛顿迭代法在MATLAB中,我们可以轻松地利用内置的牛顿迭代函数来进行数值计算。
通过简单的一行代码,可以快速地求解函数的零点,从而解决一些复杂的数值计算问题。
通过调用MATLAB中的`fzero`函数,我们可以方便地求解给定函数的零点,从而得到微分方程的数值解。
3. 牛顿迭代法在微分方程中的应用微分方程是自然界中许多现象的数学模型,而求解微分方程往往是一项困难的任务。
利用牛顿迭代法,我们可以将微分方程转化为求解函数零点的问题,从而通过MATLAB快速地得到微分方程的数值解。
这种方法在实际工程和科学应用中有着重要的意义,并且可以方便地与其他数值计算方法相结合,得到更精确的结果。
4. 边界平衡点及其在系统稳定性分析中的应用边界平衡点是微分方程系统中特殊的状态,对于系统的稳定性分析有着重要的影响。
利用牛顿迭代法,我们可以求解微分方程在边界平衡点附近的线性化方程,从而得到系统的特征根,进而分析系统的稳定性。
通过MATLAB中的数值计算和可视化工具,我们可以直观地理解系统的稳定性特性,并且为工程设计和控制算法的优化提供重要的参考。
5. 个人观点和总结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编程实现了迭代法、牛顿法和二分法,并通过实例验证了它们的准确性和收敛速度。
实验结果表明,迭代法和牛顿法在求解根的过程中具有更快的收敛速度和更接近真实根的逼近结果,而二分法的收敛速度较慢。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Newton分形的原理及Matlab实现
作者:张健徐聪全付勇智
来源:《电脑知识与技术》2009年第24期
摘要:详细推导了复平面上Newton迭代法的原理和计算公式,用MATLAB编制程序实现了Newton迭代算法,得到了一些奇异、绚丽的分形图形。
对《数学实验》课程有一定的参考价值。
关键词:Newton迭代法;分形;Matlab;数学实验
中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)24-6997-03
The Principles of Newton Fractal and it's Realization Using MATLAB
ZHANG Jian, XU Cong-quan, FU Yong-zhi
(Department of Basic Courses, Southwest Forestry College, Kunming 650224, China)
Abstract: The Principles and formulas of Newton fractal was explained,fractal graphics of Newton iteration was created using Matlab.
Key words: newton iteration; fractal; Matlab; mathematical experimental
分形是非线性科学的一个重要分支,应用于自然科学和社会科学的众多领域。
其中,分形图形以其奇异、绚丽多彩的特点,广泛应用于纺织印染、广告设计、装潢设计、计算机美术教学等领域[1]。
很多分形图形都是用迭代的方式实现的,Newton迭代法就是其中的一种。
由Newton迭代法产生的分形图形称为Newton分形[2]。
很多文献都对Newton分形进行了介绍,但都没有详细的计算公式和算法说明,读者很难编制相应程序。
本文详细介绍了复平面上Newton迭代法的原理和计算公式,设计了相应的实现算法,并用Matlab编制程序实现了Newton分形的绘制,生成了一些奇异、瑰丽的分形图形。
由于国内高校《数学实验》课程大多采用Matlab软件,同时很少涉及分形图形的实验,因此,Newton分形的Matlab实现可以丰富《数学实验》课程的内容,对数学类、计算机类、艺术类学生和教师有一定的参考价值。
1 Newton迭代法
17世纪,牛顿创立了一种依靠简单迭代计算求方程f(x)=0的根的方法[3]:
任取一点x0,利用公式(1)进行迭代,若存在,则序列xt收敛于方程f(x)=0在x0附近的一个根。
我们把复数z应用到公式(1)上,就得到了复平面上的Newton迭代公式:
现在,取一个较简单的函数f(z)=zn-1,则f(z)的一阶导数f’(z)=nzn-1,代入公式(2)得:
根据复数的三角表示式,可记zt为:
zt=xt+iyt=|zt|(cosθ+isinθ) (4)
其中,称为复数zt的模,θ为复数zt的辐角的主值,-π≤θ≤π。
辐角主值θ的计算方法如下[1]:
由复变函数知识可知:
将(5)、(6)两式代入(3)得:
即有:
(8)
式(8)就是编写程序时需要的迭代计算公式。
2 Newton分形的生成算法
在复平面上取定一个窗口,将此窗口均匀离散化为有限个点,将这些点记为初始点z0,按公式(8)进行迭代。
其中,大多数的点都会很快收敛到方程f(z)=zn-1的某一个零点,但也有一些点经过
很多次迭代也不收敛。
为此,可以设定一个正整数M和一个很小的数δ,若果当迭代次数小于M 时,就有两次迭代的两个点的距离小于δ,即
则认为z0是收敛的,即点z0被吸引到方程f(z)=zn-1=0的某一个根上;反之,当迭代次数达到了M,而|zt+1-zt|>δ时,则认为点z0是发散(逃逸)的。
这就是逃逸时间算法的基本思想。
当点z0比较靠近方程f(z)=zn-1的根时,迭代过程就很少;离得越远,则迭代次数越多甚至不收敛[2]。
由此设计出函数f(z)=zn-1的Newton分形生成算法步骤如下:
1)设定复平面窗口范围,实部范围为[a1,a2],虚部范围为[b1,b2],并设定最大迭代步数M和判断距离δ;
2)将复平面窗口均匀离散化为有限个点,取定第一个点,将其记为z0,然后按公式(8)进行M 次迭代。
每进行一次迭代,按公式(9)判断迭代前后的距离是否小于δ,如果小于δ,根据当前迭代的次数M选择一种颜色在复平面上绘出点z0;如果达到了最大迭代次数M而迭代前后的距离仍然大于δ,则认为z0是发散的,选择白色(也可换为其他颜色)在复平面上绘出点z0。
3)在复平面窗口上取定第二个点,将其记为z0,按第(2)步的方法进行迭代和绘制。
直到复平面上所有点迭代完毕。
3 Matlab程序设计
Matlab是由MathWorks公司与1984年推出的数学软件,原意为“矩阵实验室”。
Matlab以其强大的功能和良好的开放性、面向问题性、易学易用等特点,越来越被广大科研人员和工程计算人员以及高校学生和老师所重视[4]。
国内外《数学实验》课程大多采用Matlab软件作为计算工具,为此,我们使用Matlab编制了绘制Newton分形的程序。
程序由3个函数组成:
1)主函数newton.m:
function f = newton(n)
m=13;%迭代次数
a1=-2;%复平面窗口实部范围
a2=2;
b1=-1.5; %复平面窗口虚部范围
b2=1.5;
delta=0.01 %收敛判定距离
hold on
for i = a1:0.02:a2
for j =b1:0.02:b2
%对每一个点,调用迭代函数,返回收敛时间(即判断为收敛时的迭代次数M) f=f_iterat(i,j,n,m,delta);
if f > 0%用7种颜色(不含白色)绘制收敛点
switch rem(f,7) %求f除以7的余数
case 0
plot(i,j,'b.')%蓝色
case 1
plot(i,j,'c.')%青色
case 6
plot(i,j,'y.')%黄色
end
end
end
hold off
2)Newton迭代函数f_iterat.m:
%参数说明:(x,y)为点的实部与虚部,n为方程的幂次,m为最大迭代次数,delta为收敛判断距离
function f=f_iterat(x,y,n,m,delta)
delta = 0.01;%收敛判断距离
f=0; %赋初值为0,表示发散
for i = 1:m
p = sqrt(x*x+y*y);%计算复数的模
seta = f_arg(x,y); %计算复数的辐角
x2=((n-1)*p*cos(seta)+p^(1-n)*cos((1-n)*seta))/n;%实部
y2=((n-1)*p*sin(seta)+p^(1-n)*sin((1-n)*seta))/n;%虚部
dis = sqrt((x2-x)^2+(y2-y)^2); %计算迭代前后两点的距离
if dis < delta %收敛
f=i; %返回收敛时间
break%结束循环
end
x=x2;
y=y2;
end
其中,函数f_arg(x,y)为计算复数z=x+iy的辐角主值θ的函数,根据公式(5)不难写出。
4 实验结果
在MATLAB命令窗口中,输入“>> newton(3)”或“>> newton(4)”,即可绘制出函数f(z)=z3-1
或f(z)=z4-1对应的Newton分形的图形:
在图1中,白色区域表示发散点所组成的区域,彩色区域为收敛点组成的区域。
收敛区域内的点,由于收敛时间的不同,所呈现的颜色不同,构成了一幅五彩斑斓、奇异复杂的图形。
输入其他的n,则可绘制出函数f(z)=zn-1对于的Newton分形,举例如下:
5 结论
用VB、VC等程序设计语言编写的Newton分形生成程序需要两个窗口:绘图窗口和参数窗口,然后要建立绘图窗口到参数窗口之间的映射[5-6]。
而用MATLAB编制的程序直接在参数窗口(复平面窗口)中绘图,所编制的程序简单易懂,所绘制的图形奇异瑰丽、绚丽多彩,体现了数学、计算机、艺术三者的结合,学生有很大的吸引力,对有关专业的教师、学生以及分形爱好者有一定的参考作用。
而且,只要稍微改动迭代参数,如迭代次数M、判断距离?啄、复窗口范围等,所得到的图形会出现很多意想不到的变化,很适合做为理工科《数学实验》课程的内容。
参考文献:
[1] 秦宣云,任波.逃逸时间法生成Julia集的算法分析和具体实现[J].计算机工程与应
用,2007,43(5):30-32.
[2] 李水根.分形[M].北京:高等教育出版社,2004:20-30.
[3] 孙博文.分形算法与程序设计[M].北京:科学出版社,2004:61-91.
[4] 曾建军,李世航,王永国等.MATLAB语言与数学建模[M].合肥:安徽大学出版社,2005:1-30.
[5] 姜卓睿,宋中山,苏斌.基于重根牛顿迭代法和比较算法实现的分形图形的研究 [J].电脑开发与应用,2008;21(7):12-13.
[6] 吴运兵,李勇.牛顿迭代法在分形图形生成上的应用研究[J].西安科技大学学
报,2005,25(3):365-367.。