程序设计思想及范例(7),迭代问题

在这里主要介绍其中的非线性方程求根问题,及其两种常用的方法。
设有非线性方程(代数方程或超越方程)

若存在数字使得,则称为方程的根。在数学中除了极少数的简单方程的根可以通过解析式表达外,一般方程的根都无法用简单表达式来表示,因此必须研究求根的近似值的方法。
假设在区间连续,且。根据连续函数的性质知在内至少有一个根,若在假设在区间单调,那么在内有唯一的根。
graphic 方程求根

REF:.txt, 二分法迭代.txt,牛顿迭代.txt,clip_image019.jpg
 
二分法迭代
TAG: 程序设计思想及范例,迭代问题,非线性方程求根问题
TEXT:
下面介绍二分法求方程根的算法步骤,事先给定小的正数。
将区间分半,取中点,求,若,则取,否则作下一步。
计算,若,取;否则取,形成新的含根区间,且。
对于新的含根区间重复上述步骤,直到,取
作为的近似值。此时的计算误差为

计算过程的图例如下:

graphic 二分法迭代过程
二分法程序简单,方法可靠。但是要求得到较精确的结果所花费的时间比较长,一般不单独使用,求方程根的主要方法是迭代法。

利用二分法,求方程的实根,精确到两位小数。
为了便于计算函数值编制函数float function(float x)。在主函数中首先给出了有根区间,在程序中用[x1,x2]表示。由于不确定函数需要执行的次数,因此使用do- while循环,循环条件为区间中点的函数值小于,当函数值小于时,近似认为当前的值为方程根。
程序代码如下:
#include "stdio.h"
#include "math.h"
float function(float x)
{
float f;
f= x*((2*x-4)*x+3)-6;
return f;
}
void main()
{
float x1,x2,x0,fx1,fx2,fx0;
x1=10;x2=-10;
fx1=function(x1);
fx2=function(x2);
do
{
x0=(x1+x2)/2.0; /* 计算中点*/
fx0=function(x0); /* 计算中点处的函数值*/
if(fx0*fx1<0) /* 计算新的区间*/
{ /* 区间中点的函数值与x1的函数值正负号相反*/
/* 区间中点的y坐标与x1点的y坐标在不同y半轴上*/
x2=x0; /* 新区间为[x1,x0]*/
fx2=fx0;
}
else
{ /* 区间中点的y坐标与x1点的y坐标在相同y半轴上*/
x1=x0; /* 新区间为[x0,x2]*/
fx1=fx0;
}
}while(fabs(fx0)>=1e-6);
printf("The root is %f",x0);
}


REF:.txt, 非线性方程求根问题.txt,clip_image051.jpg
 
牛顿迭代
TAG: 程序设计思想及范例,迭代问题,非线性方程求根问题
TEXT:
下面介绍常用的牛顿迭代法。
设是的一个近似根,把在处作泰勒展开

求前两项近似代替,则近似线性方程为

设,令其解为,得

此方程为的牛顿迭代格式。
此迭代格式的图解如图10-4所示。
graphic 牛顿迭代过程
.. 是点处的切线为

与轴的交点的横坐标。新的近似值是代替曲线的切线与轴向相交得到。继续取点,再作切线与轴相交,又得到。由此可知,只要初始值充分靠近,就很快的收敛于方程的根。

利用牛顿迭代法,求方程的实根,精确到两位小数。
为了方便计算函数值和函数的导数值,编制函数float function(float x)用于计算函数值,编制float derivative(float x)计算函数的一阶导数值。
#include "stdio.h"
#include "math.h"
float function(float x)
{
float f;
f= x*((2*x-4)*x+3)-6;
return f;
}
float derivative(float x)
{
float f;
f= (6*x-8)*x+3;
return f;
}
void main()
{
float x,x0,fx,f;
x=1.5;
do
{
x0=x;
fx=function(x0);
f=derivative(x);
x=x0-fx/f;
}while(fabs(x-x0)>=1e-6);
printf("The root is %f",x0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值