计算方法第2章方程求根(1)

合集下载

计算方法(孙志忠)习题 第二章方程求根

计算方法(孙志忠)习题 第二章方程求根

第二章 方程求根
一、填空题
1、3 ()2510f x x x =−−=用二分法求方程在区间[1,3]内的根,进行
一步后根所在区间为( ),进行两步后根所在区间为( )。

2、解方程()0f x =的简单迭代法的迭代函数()x ϕ满足在有根区间内
( ),则在有根区间内任意取一点作为初始值,迭代解都收敛。

3、设)(x f 可微,求方程)(x f x =根的牛顿迭代格式是( )。

二、问答题
1、用牛顿法求方程30()10 1.5f x x x x =−−==在附近的一个根,并精确到6位有效数字。

[]42,
11,2x x =−2.给定方程()试说明该方程在内有根;
(2)构造一个求此根的收敛的迭代法,并说明理由。

3、给定方程()(1)10x f x x e =−−= 1) 分析该方程存在几个根;
2) 用迭代法求出这些根,精确至5位有效数;
3) 说明所用的迭代格式是收敛的。

2022年九年级数学上册第二章一元二次方程2.2用配方法求解一元二次方程第1课时直接开平方法与配方法

2022年九年级数学上册第二章一元二次方程2.2用配方法求解一元二次方程第1课时直接开平方法与配方法

0,
1 3
y
2
1
5,

1 y 1 5, ②
3
1 y 1 5, ③
3
y 3 5 1, ④
解:不对,从开始错,应改为
1 3
y
1
5,
y1 3 5 3, y2 3 5 3.
5.解下列方程:
1 x2 4x 4 5
x 22 解5, : x 2 5,
x 2 5, x 2 5,
第二章 一元二次方程
2.2用配方法求解一元二次方程
(第1课时 直接开平方法与配方法(1))
学习目标
1.会用直接开平方法解形如(x+m)2=n (n>0)的方程. (重点) 2.理解配方法的基本思路.(难点) 3.会用配方法解二次项系数为1的一元二次方程. (重点)
复习引入
导入新课
1.如果 x2=a,则x叫作a的 平方根 .
(B) (x-2)2=4,解方程,得x-2=2,x=4
(C)
4(x-1)2=9,解方程,得4(x-1)=
±3,
1
x1=4
;
x2=
7 4
(D) (2x+3)2=25,解方程,得2x+3=±5, x1= 1;x2=-4
2.填空:
(1)方程x2=0.25的根是 x1=0.5,x2=-0.5 . (2)方程2x2=18的根是x1=3,x2=-3 . (3)方程(2x-1)2=9的根是x1=2,x2=-1 .
的实数根 x1 p ,x2 p ;
(2)当p=0 时,方程(I)有两个相等的实数根 x1 x2 =0;
(3)当p<0 时,因为任何实数x,都有x2≥0 ,所以
方程(I)无实数根.

计算方法 实验一 方程求根

计算方法 实验一 方程求根

实验一方程求根(1)二分法
1、实验程序
实现二分法的MATLAB函数文件agui_bisect.m
2. 在MATLAB命令窗口输入及实验结果及操作界面
(2)迭代法
1、实验程序
实现二分法的MATLAB函数文件agui_iterative.m
2、在MATLAB命令窗口输入及实验结果及操作界面
(3)牛顿法
1、实验程序
实现二分法的MATLAB函数文件agui_newton.m
2、在MATLAB命令窗口输入及实验结果及操作界面
结果分析:
由上面的对二分法、迭代法、牛顿法三种方法的三次实验结果,我们可以得出这样的结论:
二分法要循环k=10次,迭代法要迭代k=4次,牛顿法要迭代k=2次才能达到精度为0.5*10^-3的要求,而且方程0210=-+x e x
的精确解经计算,为0.0905250,由此可知,牛顿法和迭代法的精确度要优越于二分法。

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

从而可知牛顿迭代法收敛速度明显加快,但由所学的内容可知,其收敛性与初值有关,它是局部收敛的。

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

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

总之各种方法都各有优劣,适用于不同的情况中,须具体情况具体分析。

第2章方程的近似解法

第2章方程的近似解法

第二章 方程求根在许多实际问题中,常常会遇到方程f(x)=0求解的问题。

当f(x)为一次多项式时,f(x)=0称为线性方程,否则称为非线性方程。

对于非线性方程,由于f(x)的多样性,求其根尚无一般的解析方法可以使用,因此研究非线性方程的数值解法是十分必要的。

法、迭代法、牛顿法及割线法。

这些方法均是知道根的初始近似值后,进一步把根精确化,直到达到所要求的 精度为止。

也即求非线性方程根的数值方法。

第一节 第一节 增值寻根法与二分法2.1.1 增值寻根法设非线性方程f(x)=0的根为*x ,增值寻根法的基本思想是,从初始值0x 开始,按规定 的一个初始步长h 来增值。

令 1n x +=n x +h(n=0,1,2,…),同时计算f(1n x +)。

在增值的计算过程中可能遇到三种情形:(1) f(1n x +)=0,此时1n x +即为方 程的根*x 。

(2) f(n x )和f(1n x +)同符号。

这说明区间[n x , 1n x +]内无根。

(3) f(n x )和f(1n x +)异号,f(n x )·f(1n x +)<0此时当f(x)在区间[n x , 1n x +]上连续时,方程f(x)=0在[n x , 1n x +] 一定有根。

也即我们用增值寻根法找到了方程根的存在区间,n x 或1n x +均可以视为根的近似值。

下一步就是设法在该区间内寻找根 *x 更精确的近似值,为此再用增值寻根法 把n x 作为新的初始近似值,同时把步长缩小,例如选新步长1100h h =,这 样会得到区间长度更小的有根区间,从而也得到使f(x)n x ,作为*x 更 精确的近似值,若精度不够,可重复使用增值寻根法,直到有根区间的长度|1n x +-n x |<ε(ε为所要求的精度)为止。

此时f(n x )或f(1n x +)就可近似认为是零。

n x 或1n x +就是满足精度的方程的近似根(如图2-1).2—1例1 用增值寻根法求方程f(x)=324x x +-10=0的有根区间。

力学中的计算方法(方程求根)

力学中的计算方法(方程求根)

ˆK x
Fixed-Point Iteration ( x K 1 x K ) 2 xK x K 2 x K 1 x K 2
y=x
x0 , x1 g( x0 ), x2 g( x1 ), ˆ 0 , x3 g( x2 ), x ˆ 1 , x4 g( x3 ), x ... ...
0 f ( x*) f ( x0 ) f ( x0 )( x * x0 ) y
x* x0
f ( xk ) x k 1 x k f ( x 线性 /* linear */ k)
f ( x0 ) f ( x0 )
x*
x
x0
只要 f C1,每一步迭代都有 xk x * , f ’( xk ) 0, 而且 lim k 则 x*就是 f 的根。


1 | x k 1 x k | | x * xk | 1 L

L | x1 x0 | | x * xk | 1 L

k
( k = 1, 2, … )
且存在极限
lim
k
x * x k 1 g x * x * xk

Fixed-Point Iteration
1 | x k 1 x k | ? ④ | x * xk | 1 L | x k 1 x k | | x * x k | | x * x k 1 | | x * x k | L | x * x k | | x k 1 x k | 来 Lk 可用 | x1 x0 | ? ⑤ | x * xk | 1 L 控制收敛精度
Bisection Method
When to stop?

计算方法(各种方法的程序源代码)

计算方法(各种方法的程序源代码)

第一章求根公式法:#include<stdio.h>#include<math.h>main(){int a,b,c;double x1,x2,d=0.0;printf("请输入a,b,c的值:\n");scanf("%d,%d,%d",&a,&b,&c);d=b*b-4*a*c;if(d>=0){if(d>0){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}else{ x1=-b/(2*a);x2=x1;printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}}else{printf("方程无实根\n");}return 0;}二分法:#include<stdio.h>#include<math.h>double f(double x){double y;y=x*x*x-2*x-5;return y;}main(){double a=2.0,b=3.0,x;if(f(a)*f(b)<0.0){do{x=(a+b)/2.0;if(f(a)*f(x)<0.0){b=x;continue;}if(f(x)*f(b)<0.0)a=x;}while(fabs(a-b)>0.01);}else printf("没有实根");printf("实根为%f",x);return 0;}第二章拉格朗日插值:#include <iostream>#include <iomanip>#include <stdlib.h>using namespace std;#define N 100void lagrange(){int n,k,m,q=1;float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;cout<<"请输入X的个数:";cin>>n;for(k=0;k<=n-1;k++){cout<<"请输入X"<<k<<"的值:";cin>>x[k];cout<<"请输入Y"<<k<<"的值:";cin>>y[k];}system("cls");cout<<"则Xi与Yi表格如下:"<<endl;cout<<"Xi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<x[k]; cout<<endl;cout<<"Yi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<y[k]; cout<<endl;while(q){cout<<"请输入所求x的值:";cin>>xx;while(xx>x[k-1]||xx<x[0]){cout<<"输入错误,请重新输入:";cin>>xx;}for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m] ));cout<<"则拉格朗日分段线性插值为:"<<yyy1<<endl;for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}if((xx-x[m])>(x[m+1]-xx))m=m+1;else m=m;yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1])); yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1])); yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m])); yyy2=yy1+yy2+yy3;cout<<"则拉格朗日分段二次插值为:"<<yyy2<<endl;cout<<"是否输入其余要求x的值[是(1),否(0)]:";cin>>q;}system("cls");}void main(){lagrange();}牛顿插值:#include<stdio.h>#include<math.h>main(){float a[]={0,1,2,3,4},b[]={3,6,11,18,27};float f[5],x,t,m,n,s=0;int i,j,k,l;printf("请输入x的值:");scanf("%f",&x);f[0]=b[0];for(i=1;i<5;i++){m=0;for(j=0;j<=i;j++){t=1;for(k=0;k<=i;k++){if(k!=j) t=t/(a[j]-a[k]);}m=m+b[j]*t;}n=1;for(l=0;l<i;l++) n=n*(x-a[l]);s=s+m*n;}s=s+f[0];printf("s=%f",s);return 0;}线性和二次插值法:#include<stdio.h>#include<math.h>main(){floata[]={0.4,0.5,0.6,0.7,0.8,0.9},b[]={-0.916291,-0.693147,-0.510826,-0.3566 75,-0.223144,-0.105361};float x,t,m,p1=0.0,p2=0.0,p3=0.0;int i,j;printf("请输入x的值");scanf("%f",&x);for(i=0;i<2;i++){t=0.0;for(j=0;j<2;j++){if(j!=i) t=t+((x-a[j])/(a[i]-a[j]))*b[i];}p1=p1+t;}printf("线性插值的结果为:%f",p1);for(i=0;i<3;i++){m=1.0;for(j=0;j<3;j++){if(j!=i) m=m*((x-a[j])/(a[i]-a[j]));}p2=p2+m*b[i];}printf("取0.4,0.5,0.7,的二次插值的结果为:%f",p2); for(i=1;i<4;i++){m=1.0;for(j=1;j<4;j++){if(j!=i) m=m*((x-a[i])/(a[i]-a[j]));}p3=p3+m*b[i];}printf("取0.5,0.6,0.7的二次插值的结果为:%f",p3);return 0;}直线拟合法:#include<stdio.h>#include<math.h>main(){float X[5]={-2,-1,0,1,2},Y[5]={0,0.2,0.5,0.8,1.0}; float a=0,b=0,c=0,d=0,m,n;int i;for(i=0;i<5;i++){a=a+X[i];b=b+Y[i];c=c+X[i]*X[i];d=d+X[i]*Y[i];};m=(b*c-a*d)/(5*c-a*a);n=(5*d-c*a)/(5*c-a*a);float x,y;printf("请输入X的值");scanf("%f",&x);y=m+n*x;printf("拟合后代入x的值得出的结果为:%f",y); return 0;}第三章复化辛甫生算法:#include<stdio.h>#include<math.h>float f(float x){float y;y=3*x*x+2*x;return y;}main(){float a,b,h,s;int k=1,n;printf("请输入a,b,n");scanf("%f,%f,%d",&a,&b,&n);h=(b-a)/n;s=f(b)-f(a);for(float x=a;k<n;k++){x=x+h/2;s=s+4*f(x);x=x+h/2;s=s+2*f(x);}s=(h/6)*s;printf("s=%f",s);}龙贝格算法:#include<stdio.h>#include<string.h>#include<math.h>#include<conio.h>#include<stdlib.h>float f(float x){return (2*x);}float r(float a,float b){int k=1;float s,x,t1,t2,s1,s2,c1,c2,r1,r2,h=b-a,p;t1=h*(f(a)+f(b))/2;while(1){s=0;x=a+h/2;do{s+=f(x);x+=h;}while(x<b);t2=(t1+h*s)/2.0;if(fabs(t2-t1)<p)return(t2);s2=t2+(t2-t1)/3.0;if(k==1){t1=t2;s1=s2;h/=2;k+=1;continue;}c2=s2+(s2-s1)/15.0;if(k==2){c1=c2;t1=t2;s1=s2;h/=2.0;k+=1;continue;}r2=c2+(c2-c1)/63;if(k==3){r1=r2;c1=c2;t1=t2;s1=s2;h/=2;k+=1;continue;};if(fabs(s1-s2)<p)return(s2);r1=r2;c1=c2;t1=t2;s1=s2;h/2;k+=1;return(r1);}}main(){int i;float a,b,p,s,clrsca();printf("\n input integrate f(x) the begin:");scanf("%f",&a);printf("\n input integrate f(x) the end:"); scanf("%f",&b);printf("\n input p:");scanf("%f",&p);s=r(a,b);printf("the result is:%f",s);getch();return(s);}变步长积分法:#include<stdio.h>#include<math.h>void main(){double k,a,b;int kk,n;double sum[100],t[100];printf("方程为f(x)=x/(4+x^2),积分区间为[0,1]\n");printf("请输入预定精度a的值\n");scanf("%lf",&a);t[0]=0.1;t[1]=0.1088;for(k=1.0,kk=1;fabs(t[kk]-t[kk-1])>=a;k++,kk++){for(n=1,sum[kk+1]=0;n<=pow(2.0,k);n++){b=(2*n-1)/pow(2.0,k+1);sum[kk+1]+=b/(4+b*b);}t[kk+1]=0.5*t[kk]+(1/pow(2.0,k+1))*sum[kk+1];}printf("\n方程利用变步长梯形法积分后的积分值为%f\n",t[kk]);}第四章:欧拉法:#include<stdio.h>#include<math.h>#include<string.h> #include<stdlib.h> float f(float x,float y){ float f;f=x+y;return f;};main(){float x[6],y[6],h;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;y[n]=y[0]+h*f(x[0],y[0]);printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}改进欧拉法:#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>float f(float x,float y){float f;f=x+y;return f;};main(){float x[6],y[6],h,yp,ye;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;yp=y[0]+h*f(x[0],y[0]);ye=y[0]+h*f(x[n],yp);y[n]=(yp+ye)/2;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}四阶龙格库塔法:#include<stdio.h>#include<math.h>#include<string.h>float f(float x,float y){float f;f=x+y;return f;}main(){float x[11],y[11],h,k1,k2,k3,k4;printf("请分别输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(int n=1;n<11;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;k1=f(x[0],y[0]);k2=f(x[0]+h/2,y[0]+h*k1/2);k3=f(x[0]+h/2,y[0]+h*k2/2);k4=f(x[n],y[0]+h*k3);y[n]=y[0]+h*(k1+2*k2+2*k3+k4)/6;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}第六章迭代法:#include<stdio.h>#include<math.h>#include<string.h>double F1(double x);double Newton(double x0, double e); int main(){double x0 = 0.5;double e = 10E-6;printf("x = %f\n", Newton(x0, e));getchar();return 0;}double F1(double x){return log(x+2)/log(10);}double Newton(double x0, double e) {double x1;do{x1 = x0;x0 =F1(x1);} while (fabs(x0 - x1) > e);return x0;}埃特金加速法:#include<stdio.h>#include<conio.h>#include<math.h>#define h 1.E-10 double f(double x0) {x0=exp(-x0);return x0;}double sub(double x) {if(x>=0)return x;else return -x;}main(){double x0=0.5,x,s=0.0; do{x=f(x0);s=sub(x-x0);x0=x;}while(s>h); printf("x=%f",x); getch();return 0;}快速弦截法:#include<stdio.h>#include <math.h>float f(float x){float y;y=x*exp(x)-1;return (y);}float xpoint(float x1,float x2){float y;y=(x1*f(x2)-x2*f(x1)) / (f(x2) - f(x1));return (y) ;}float root(float x1, float x2) {int i;float x,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0000001); return (x);}main(){float x1,x2,f1,f2,x;do{printf("input x1,x2:\n");scanf("%f,%f",&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf("A root of equation is %8.4f\n",x); }第七章高斯消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],m[10][10],x[10],sum; int i,j,k,n;printf("the top exp:");scanf("%d",&n);printf("\n");for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%f",&a[i][j]);}for(i=0;i<n;i++){scanf("%f",&b[i]);}for(k=0;k<n-1;k++){if(a[k][k]==0)printf("error");else {for(i=k+1;i<n;i++){m[i][k]=a[i][k]/a[k][k];} };a[i][k]=m[i][k];b[i]=b[i]-m[i][k]*b[k];for(j=k+1;j<n;j++)a[i][j]=a[i][j]-m[i][k]*a[k][j];};if(a[n-1][n-1]==0)printf("error");else x[n-1]=b[n-1]/a[n-1][n-1];b[n-1]=x[n-1];for(i=n-2;i>=0;i--){sum=0;for(j=i+1;j<n;j++){sum+=a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];b[i]=x[i];}for(i=0;i<n;i++)printf("%f\n",x[i]);}return 0;}选主元消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],s,t,e,sum; int i,j,k,n,m;printf("The top exp is "); scanf("%d",&n);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);for(i=0;i<n;i++)scanf("%f",&b[i]);scanf("%f",&e);k=0;do{t=a[k][k];for(i=k;i<n;i++){if(fabs(t)<fabs(a[i][k])){t=a[i][k];m=i;}else m=k;}if(fabs(t)<e)printf("det A = 0\n");else {if(m!=k){for(j=0;j<n;j++){s=a[m][j];a[m][j]=a[k][j];a[k][j]=s;}s=b[m];b[m]=b[k];b[k]=s;}for(i=k+1;i<n;i++)for(j=k+1;j<n;j++){a[i][k]=a[i][k]/a[k][k];a[i][j]=a[i][j]-a[i][k]*a[k][j];b[i]=b[i]-a[i][k]*b[k];}}k++;}while(k<n-2);if(fabs(a[n-1][n-1])<e)printf("det A = 0\n");else {b[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){sum=0;for(k=i+1;k<n;k++){sum+=a[k][j]*b[j];}b[i]=(b[i]-sum)/a[i][i];}}for(i=0;i<n;i++)printf("%f\n",b[i]);}追赶法:#include<stdio.h>#include<math.h>main(){int i,j,k,n;float d[10][10],g[10],a[10],b[10],c[10],x[10],y[10],f[10];printf("the top exp is ");scanf("%d",&n);scanf("%f,%f,%f,%f",&d[0][0],&d[0][1],&d[n-1][n-2],&d[n-1][n-1]); for(i=1;i<n-1;i++)for(j=i-1;j<=i+1;j++)scanf("%f",&d[i][j]);for(i=0;i<n;i++)scanf("%f",&g[i]);for(i=1;i<n-1;i++)a[i]=d[i][i-1];for(i=0;i<n;i++)b[i]=d[i][i];for(i=0;i<n-1;i++)c[i]=d[i][i+1];f[0]=c[0]/b[0];for(k=1;k<n-1;k++)f[k]=c[k]/(b[k]-a[k]*f[k-1]);y[0]=g[0]/b[0];for(i=1;i<n;i++)y[i]=(g[i]-a[i]*y[i-1])/(b[i]-a[i]*f[i-1]); x[n-1]=y[n-1];for(i=n-2;i>=0;i--)x[i]=y[i]-f[i]*x[i+1];for(i=0;i<n;i++)printf("%f\n",x[i]);}。

解一元二次方程公式法

解一元二次方程公式法

公式法是这样生产的
你能用公式法解方程 2x2-9x+8=0 吗?
解 : a 2 ,b 9 ,c 8 .1.变形:化已知方程为一般形式;
b 2 4 a c 9 2 4 2 8 1 7 0 .
x b b 2 4 ac 2a
9 17
22 9 17 .
4
2.确定系数:用a,b,c写出各项系数;
九年级数学(上)第二章 一 元二次方程
3.公式法(1) 一元二次方程解法
配方法
回顾与复习 1
我们通过配成完全平方式的方法,得到了一元 二次方程的根,这种解一元二次方程的方法称为 配方法(solving by completing the square)
助手 用配方法解一元二次方程的方法的
:
平方根的意义:
公式法将从这里诞生
你能用配方法解方程 2x2-9x+8=0 吗?
解:x29x40.
2
x2 9 x 4.
x29x292924.
x
2 9
2417
.
4
4 16
1.化1:把二次项系数化为1;
2.移项:把常数项移到方程的右边;
3.配方:方程两边都加上一次项系数绝对值 一半的平方;
4.变形:方程左分解因式,右边合并 同类;
8.x1909..xx2714x;3;xx139 .43.273. 16x2+8x=3 ;
1
1 参 考 答 案 :2 12
2
ቤተ መጻሕፍቲ ባይዱ
12
1
2
解:设这三个 一个连 直角续 三角偶 的 形三数 一 边的中 个 长x为间 ,为 根 三个据 连续题 偶 意得
x2 x 数 ,求2 这2 个三x角 形2 的2 .三边长.

方程求根(计算方法)

方程求根(计算方法)

高斯像(2)
高斯像(3)
高斯像(4)
第二章 方程求根
§2.2 二分法
§2.2 二分法
❖ 定义:如果函数f(x)在区间[a,b]上连 续,且f(a)f(b)<0,则方程在区间[a,b]上 一定有实根,[a,b]叫方程的有根区间。
【注记】f(a)f(b)<0只保证有实根, 但并不保证根是 唯一, 即不保证是单根, 也不排斥f(a)f(b)>0时在[a,b] 上有根的情形。即,f(a)f(b)<0对于在[a,b]上有实根 是充分的, 但不必要;f(a)f(b)<0对于在[a,b]上有唯 一单实根不充分也不必要。如图所示:
§2.1 问题的提出
• 有多种数值算法可以求解非线性方程, 我们在本章将学习其中得几种,它们是:
✓ 二分法(bisection method) ✓迭代法(iteration method) ✓牛顿法(Newton method) ✓牛顿下山法(Newton downhill method)。
牛顿(1)
§2.1 问题的提出
➢ 扫描流程
§2.1 问题的提出
【历史注记】人们很早就探索了高次方程的数值解 的求法。巴比伦泥板中有平方表和立方表,利用它 们可以解某些特殊的二次和三次方程。中国古人相 当系统地解决了求高次方程数值解的问题,《九章 算术》以算法形式给出了二次方程及正系数三次方 程正根的具体计算程序;7世纪王孝通也给出了求 三次方程正根的数值解法;11世纪贾宪在《黄帝九 章算法细草》中创“开方作法本源图”,用“立成 释锁法”解三次和三次以上高次方程, 同时他又提 出一种更为简便的“增乘开方法”;13世纪秦九韶 在《数书九章》中的“正负开方术”最后完成,提 供了一个用算筹布列解任何次数字方程的可行算法。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章 方程求根
第2章 方程求根

内容提要
二分法 迭代法
牛顿法
割线法
2
2.1 问题的提出
方程 f x 0
如果有 *使得 x* 0 x f ,则称 *为方程的根,或函数x的零点。 x f

* m
如果函数 f x 0 能写成如下形式
f x x x
11
2.2 二分法
a0 b0 a0 a, b0 b, x0 2
f(x)
f (a0) · (x0) < 0 f
x* a0 O x0 b1 b0
a1=a0, b1=x0
12
2.2 二分法
t; 0 f
a1
O a2 x1 x*
a2=x1, b2=b1
b1
本节介绍求有根区间(隔离区间)的方法。
5
2.1 问题的提出
确定根的隔离区间的具体方案:
1.作y=f(x)草图,由f(x)与横轴交点的大致位置确定隔离区间
2.将f(x)=0在求根区间内改写成f1(x)=f2(x),然后根据交点 横坐标的大致位置来确定根的隔离区间;
f(x)
a
O
x *
x b
6
2.1 问题的提出
1 bk ak k (b a) 2
14
2.2 二分法
最后一个区间的长度为:
1 bk ak k (b a) 2
误差分析:
b0 a0 b a a0 b0 有误差 |x* x0| 产生的 x0 2 2 2 b ak b a a b 第k步产生的 xk k k 有误差 |x* xk| k k 1 2 2 2
O a x*
f(x) x b
在求方程近似根的方法中,最直观、最简单的方法是 二分法。
函数f(x)在[a,b]内连续,严格单调,且有f(a)f(b)<0,则在 [a,b]内方程 f(x)=0 有且仅有1个实根,即[a,b]为原方程的 一个有根区间。 二分法基本思想:用对分区间的方法根据分点处函数f(x)值的 符号逐步将有根区间缩小,使在足够小的区间内,方程有且仅 有1个根。
y1=x 0 P2
P* Q1
P0
P1
发散的迭代法
x2
x1
x0 x*
x
30
2.3.1 迭代格式的构造及其敛散性条件
定理2.1 设有方程 x (x) ,如果函数 (x) 在区间[a,b]上具有一阶 连续导数,且满足下面两个条件: (a)当x[a,b]时, ( x) [a, b] x [a, b], 有 ' ( x) L (b)存在正常数L<1,使对任意
2 在该区间原方程等价于 e x x
x
y1 e
从图像可知,原方程在 [0.5,1]内有唯一实根。
y2 2 x
9
2.1 问题的提出
例:求 解:
x 2e
x
的有根区间。
f1 ( x) 2 x
f 2 ( x) e x
有根区间[-2,-1] 有根区间[1,2]
10
2.2 二分法
则有
(1)方程 x (x) 在区间[a,b]上有唯一的根 x *
(2)对任意初值x0[a,b],迭代公式 xk 1 ( xk ), k 0,1,2 产生的序列 {x k }收敛于方程的根 x *
31
2.3.1 迭代格式的构造及其敛散性条件
L (3) x xk 1 L xk xk 1 , k 1,2,... k xk 1 x* L * lim ' x* (4) x xk 1 L x1 x0 k 1,2,...(5) k xk x*

称为渐进误差估计式。
32
2.3.1 迭代格式的构造及其敛散性 条件

(a)当x[a,b]时, ( x) [a, b]
y y1=x y2=(x)
Q1 Q2
P 0 * x* P2 x2 x1
P0
P1 x0 x
33
2.3.1 迭代格式的构造及其敛散性 条件
(b)存在正常数L<1,使对任意 x [a, b], 有 ' ( x) L y Q1 Q2 0 P * x* P2 x2 x1 y1=x P0

gx, 且g x 0, m 1
*
则称 *为f x 0的m重根,或 x m重零点。 x f 的
一重根通常称为单根。
3
2.1 问题的提出
如果 f x 为超越函数,则称 f x 0 为超越方程;如果
f x 为n次多项式,则称 f x 0 为n次代数方程。
ln 2
16
2.2 二分法
f ( x) x3 x2 2x 1 0 例3:用二分法求方程
在区间[0,1]内的1个实根,要求有3位有效数字。
* 因 f 0.1 0 所以 x 0.1,1


由有效数字确定精度
17
2.2 二分法
18
2.2 二分法
总结
二分法的优点是计算简单,方法可靠。
因此,迭代法最重要的是如何构造一个合适的迭代公 式。
21
2.3 迭代法
粗糙的初值 基本思想:逐次逼近
方程求根 方程组求解 矩阵求特征值 ……
迭代公式
反复校正
满足精度要求的结果
22
2.3.1 迭代格式的构造及其敛散性条件
方程 x 0在区间a, b内有一个根 f x
*
在区间[a, b]内将原方程改写成同解 方程x x
15
2.2 二分法
对于给定的精度
ba ba 因为 x xk k 1 取 k 1 ε 2 2
*
x * xk ε 则有
对于给定的精度 ,可估计二分法所需的步数 k :
ba x xk k 1 ε 2
*

lnb a ln ε 1 k
确定根的隔离区间的具体方案:
O a x *
f(x) x
b
3.逐步搜索,f(x)在连续区间[a,b]内选择一系列的x值,x1, x2, …, xk, 看f(x)在这些点的符号变化情况,出现2个相邻 点上函数值异号,则在此小区间至少有1个实根。 数学依据: 函数f(x)在[a,b]内连续,严格单调,且有f(a)f(b)<0,则在 [a,b]内方程 f(x)=0 有且仅有1个实根。
x1 6.5 x2 19 .625 x3 191 .070


k变大时,xk远离原方程的精确根。
27
2.3.1 迭代格式的构造及其敛散性条件
一般来说,方程可以写成多种等价形式 x x 。关键是这 xk 样构造的迭代公式 xk 1 xk ,当 时, 是否与 k 精确根无限接近。 如何构造 x ?
二分法的缺点是不能求偶数重根,也不能求复根,收 敛速度不快。
19
2.2 二分法
总结
二分法一般在求方程根时不太单独使用,常用 来为其它方法求方程近似根时提供好的初值。 方程求根最常用的方法是迭代法。
20
2.3 迭代法
迭代法是数值计算中一类典型方法,被用于方程求根、 方程组求解、矩阵求特征值等。 迭代法的基本思想是一种逐次逼近的方法,首先给一 个粗糙的初值,然后用同一个迭代公式,反复校正这 个初值,直到满足预先给出的精度要求为止。
7
2.1 问题的提出
例 1 求 f x x3 3x2 4x 3 0 的有根区间。
解:可以利用函数图像求,但比较复杂。
' 因为 f x 在 , 内保号,即
f x 3x 1 1 0
' 2
f x 是单调增加函数,所以原方程在实数域内最多只有一 个实根。
理论证明,对于次数大于等于5的代数方程,它的根 不能用方程系数的解析式表示。对于一般的超越方程, 更没有求根的公式。
实际问题中,求方程的根时,不一定需要得到根的准 确值,而只需要求得满足一定精度的近似根就可以。
4
2.1 问题的提出

方程的求根问题,一般分两步进行:
1.
2.
求根的隔离区间。确定根所在的区间,使方程在这个 小区间内有且仅有一个根,这一过程称为根的隔离。 所得小区间称为根的隔离区间或有根区间。所求隔离 区间越小越好。这一步可以获得方程各个根的近似值。 将根精确化。已知一个根的近似值后,再用一种方法 把此近似值精确化,使其满足给定的精度要求。
*

L x xk xk xk 1 , k 1,2,... 1 L 用计算结果 xk与xk 1 来估计误差,因而称为误差事后估计式。
说明:
*
Lk x* xk x1 x0 1 L
k 1,2,...
称为误差事前估计式。
xk 1 x* lim ' x* k x x* k
例 给定方程 f x x2 2x 3 0,它在[2,4]内有唯一根 x *
(1)
x 2x 3
( x) 2 x 3
取 x0 4
xk 1 2xk 3, k 0,1,2,...
25
2.3.1 迭代格式的构造及其敛散性条件
x1 2 x0 3 11 3.317 x2 2 x1 3 3.104 x3 2 x2 3 3.034 x4 2 x3 3 3.011 x5 2 x4 3 3.004
xk
是否收敛?
怎样估计误差?
28
2.3.1 迭代格式的构造及其敛散性条件
y
xk 1 xk
Q1
y1=x
y2=(x) P0
相关文档
最新文档