实用文案
1:第二章
(1)二分法求解非线性方程: #include
printf(\容许误差 */ scanf(\ printf(\ for(;;)
{scanf(\
if(f(a)*f(b)>=0) /* 判断是否符合二分法使用的条件 */ printf(\二分法不可使用,请重新输入:\\n\ else break; } do
{ x=(a+b)/2; k++;
if(f(a)*f(x)<0) /* 如果f(a)*f(x)<0,则根在区间的左半部分 */ b=x;
标准文档
实用文案
else if(f(a)*f(x)>0) /* 否则根在区间的右半部分 */ a=x;
else break;
}while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2; /* 取最后的小区间中点作为根的近似值 */ printf(\}
运行结果: intput eps 0.00001 a,b= 2,-5
The root is x=1.324721, k=20 Press any key to continue
总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。 (2)牛顿法求解非线性方程: #include
float f(float x) /* 定义函数f(x) */ { return((-3*x+4)*x-5)*x+6; }
标准文档
实用文案
float f1(float x) /* 定义函数f(x)的导数 */ { return (-9*x+8)*x-5; } void main()
{ float eps,x0,x1=1.0; printf(\
scanf(\输入容许误差 */ do
{ x0=x1; /* 准备下一次迭代的初值 */ x1=x0-f(x0)/f1(x0); /* 牛顿迭代 */
}while(fabs(x1-x0)>eps); /*当满足精度,输出近似根*/ printf(\}
程序运行结果: x=1.265328
总结:关键是牛顿迭代的应用,程序中最大缺点是函数及其导数已唯一给出确定不可求的随意函数的根,牛顿法比二分法收敛快,可以求重根。
2:第三章
(1)列主元素消去法求解线性方程: #include
using namespace std;
标准文档
实用文案
void load(); float a[N][N]; int m; int main(){
int i,j; int c,k,n,p,r;
float x[N],l[N][N],s,d;
cout<<\下面请输入未知数的个数m=\cin>>m; cout< cout<<\请按顺序输入增广矩阵a:\load(); for(i=0;i { for(j=i;j c=(fabs(a[j][i])>fabs(a[i][i]))?j:i; /*找列最大元素*/ for(n=0;n {s=a[i][n]; a[i][n]=a[c][n]; a[c][n]=s;} /*将列最大数防在对角线上*/ for(p=0;p for(k=i+1;k 标准文档 实用文案 { l[k][i]=a[k][i]/a[i][i]; for(r=i;r x[m-1]=a[m-1][m]/a[m-1][m-1]; for(i=m-2;i>=0;i--) { } cout<<\该方程组的解为:\for(i=0;i cout<<\//system(\return 0; d=0; for(j=i+1;j d=d+a[i][j]*x[j]; x[i]=(a[i][m]-d)/a[i][i]; /*求解*/ } void load() { 标准文档
数值计算方法编程作业(C语言版)



