matlabscanf函数,⽜顿迭代法(⽜顿-拉弗森⽅法(Newton-
Raphsonme。。。
起源[编辑]
⽜顿法最初由艾萨克·⽜顿在Method of Fluxions,1671年完成,在⽜顿死后的1736年公开发表)。约瑟夫·拉弗森也曾于1690年在⽅法说明[编辑]
蓝线表⽰⽅程
f⽽红线表⽰切线. 可以看出
x
n+1⽐
x
n更靠近
f所要求的根
x.
⾸先,选择⼀个接近函数
零点的
,计算相应的
和切线斜率
(这⾥
表⽰函数
的导数)。然后我们计算穿过点
并且斜率为
的直线和
轴的交点的
坐标,也就是求如下⽅程的解:
我们将新求得的点的
坐标命名为
,通常
会⽐
更接近⽅程
的解。因此我们现在可以利⽤
开始下⼀轮迭代。迭代公式可化简为如下所⽰:
已经证明,如果
是连续的,并且待求的零点
是孤⽴的,那么在零点
周围存在⼀个区域,只要初始值
位于这个邻近区域内,那么⽜顿法必定收敛。 并且,如果
不为0, 那么⽜顿法将具有平⽅收敛的性能. 粗略的说,这意味着每迭代⼀次,⽜顿法结果的有效数字将增加⼀倍。
利⽤迭代算法解决问题,需要做好以下三个⽅⾯的⼯作:
⼀、确定迭代变量
在可以⽤迭代算法解决的问题中,⾄少存在⼀个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
⼆、建⽴迭代关系式
所谓迭代关系式,指如何从变量的前⼀个值推出其下⼀个值的公式(或关系)。迭代关系式的建⽴是解决迭代问题的关键,通常可以使⽤递推或倒推的⽅法来完成。
三、对迭代过程进⾏控制
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程⽆休⽌地执⾏下去。迭代过程的控制通常可分为两种情况:⼀种是所需的迭代次数是个确定的值,可以计算出来;另⼀种是所需的迭代次数⽆法确定。对于前⼀种情况,可以构建⼀个固定次数的循环来实现对迭代过程的控制;对于后⼀种情况,需要进⼀步分析得出可⽤来结束迭代过程的条件。
3⽰例
欧⼏⾥德算法
最经典的迭代算法是
欧⼏⾥德算法,⽤于计算两个整数a,b的最⼤公约数。其计算原理依赖于下⾯的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表⽰成a = kb + r,则r = a mod b。假设d是a,b的⼀个公约数,则有 a%d==0,b%d==0,⽽r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公约数
同理,假设d 是(b,a mod b)的公约数,则 b%d==0,r%d==0 ,但是a = kb +r ,因此d也是(a,b)的公约数。
因此(a,b)和(b,a mod b)的公约数是⼀样的,其最⼤公约数也必然相等,得证。
欧⼏⾥德算法就是根据这个原理来做的,欧⼏⾥德算法⼜叫辗转相除法,它是⼀个反复迭代执⾏,直到余数等于0停⽌的步骤,这实际上是⼀个循环结构。其算法⽤C语⾔描述为:
int Gcd_2(int a,int b)/*欧⼏⾥德算法求a,b的最⼤公约数*/
{
if (a<=0 || b<=0)/*预防错误*/
return 0;
int temp;
while (b > 0)/*b总是表⽰较⼩的那个数,若不是则交换a,b的值*/
{
temp = a % b;/*迭代关系式*/
a = b;
b = temp;
}
return a;
}
从上⾯的程序我们可以看到a,b是迭代变量,迭代关系是temp = a % b;根据迭代关系我们可以由旧值推出新值,然后循环执a = b; b = temp;直到迭代过程结束(余数为0)。在这⾥a好⽐那个胆⼩⿁,总是从b⼿中接过位置,⽽b则是那个努⼒向前冲的先锋。
斐波那契数列
还有⼀个很典型的例⼦是斐波那契(Fibonacci)数列。
斐波那契数列为:0、1、1、2、3、5、8、13、21、…,即 fib⑴=0; fib⑵=1;fib(n)=fib(n-1)+fib(n-2) (当n>2时)。
在n>2时,fib(n)总可以由fib(n-1)和fib(n-2)得到,由旧值递推出新值,这是⼀个典型的迭代关系,所以我们可以考虑迭代算法。
int Fib(int n) //斐波那契(Fibonacci)数列
{
if (n < 1)/*预防错误*/
return 0;
if (n == 1 || n == 2)/*特殊值,⽆需迭代*/
return 1;
int f1 = 1,f2 = 1,fn;/*迭代变量*/
int i;
for(i=3; i<=n; ++i)/*⽤i的值来限制迭代的次数*/
{
fn = f1 + f2; /*迭代关系式*/
f1 = f2;//f1和f2迭代前进,其中f2在f1的前⾯
f2 = fn;
}
return fn;
}
4C语⾔代码
double func(double x) //函数
{
return x*x*x*x-3*x*x*x+1.5*x*x-4.0;
}
double func1(double x) //导函数
{
return 4*x*x*x-9*x*x+3*x;
}
int Newton(double *x,double precision,int maxcyc) //迭代次数{
double x1,x0;
int k;
x0=*x;
for(k=0;k
{
if(func1(x0)==0.0)//若通过初值,函数返回值为0
{
printf("迭代过程中导数为0!\n");
return 0;
}
x1=x0-func(x0)/func1(x0);//进⾏⽜顿迭代计算
if(fabs(x1-x0)
{
*x=x1; //返回结果
return 1;
}
else //未达到结束条件
x0=x1; //准备下⼀次迭代
}
printf("迭代次数超过预期!\n"); //迭代次数达到,仍没有达到精度return 0;
}
int main()
{
double x,precision;
int maxcyc;
printf("输⼊初始迭代值x0:");
scanf("%lf",&x);
printf("输⼊最⼤迭代次数:");
scanf("%d",&maxcyc);
printf("迭代要求的精度:");
scanf("%lf",&precision);
if(Newton(&x,precision,maxcyc)==1) //若函数返回值为1
printf("该值附近的根为:%lf\n",x);
else //若函数返回值为0
printf("迭代失败!\n");
getch();
return 0;
}
5C++代码
//此函数是⽤来求⼀元3次⽅程ax^3+bx^2+cx+d=0的解
/
/⽐如 x^3-27=0,我们就可以输⼊1 0 0 -27,这样我们就可以得到⼀个解#include
#include
matlab定义函数表达式using namespace std;
int main()
{
double diedai(double a,double b,double c,double d,double x);
double a,b,c,d;
double x=10000.0;
cout<
cin>>a>>b>>c>>d;
x=diedai(a,b,c,d,x);
cout<
return 0;
}
double diedai(double a,double b,double c,double d,double x)
{
while(abs(a*x*x*x+b*x*x+c*x+d)>0.000001)
{
x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);
}
return x;
}
6matlab代码
定义函数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。