没有合适的资源?快使用搜索试试~ 我知道了~
数值计算方法编程作业(C语言版)

温馨提示


试读
13页
真正好用的数值计算编程源码,本人亲自试验,c语言版,经典,吐血编制。 1二分法求解非线性方程 牛顿法求解非线性方程 列主元素消去法求解线性方程 LU分解法求解线性方程 拉格朗日差值多项式; 曲线拟合 辛普生求积方法 改进欧拉法求解常微分方程的初值问题 四阶龙格—库塔法 绝对超值
资源推荐
资源详情
资源评论









1:第二章
(1)二分法求解非线性方程:
#include<stdio.h>
#include <math.h>
#define f(x) ((x*x-1)*x-1)
void main()
{ float a,b,x,eps;
int k=0;
printf("intput eps");/* 容许误差 */
scanf("%f",&eps);
printf("a,b=");
for(;;)
{scanf("%f, %f",&a ,&b);
if(f(a)*f(b)>=0) /* 判断是否符合二分法使用的条件 */
printf("二分法不可使用,请重新输入:");
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(" The root is x=%f, k=%d",x,k);
}
运行结果:
intput eps
0.00001
a,b=
2,-5
The root is x=1.324721, k=20
Press any key to continue
总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快
但缺点是只能求解单根。
(2)牛顿法求解非线性方程:
#include <stdio.h>
#include <math.h>
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("input eps:\n");
scanf("%f",&eps); /* 输入容许误差 */
do
{ x0=x1; /* 准备下一次迭代的初值 */
x1=x0-f(x0)/f1(x0); /* 牛顿迭代 */
}while(fabs(x1-x0)>eps); /*当满足精度,输出近似根*/
printf("x=%f\n",x1);
}
程序运行结果:
x=1.265328
总结:关键是牛顿迭代的应用,程序中最大缺点是函数及其导数已唯一给出确定不可求的
随意函数的根,牛顿法比二分法收敛快,可以求重根。
2:第三章
(1)列主元素消去法求解线性方程:
#include<iostream>
#include<cmath>
#define N 20
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<<endl;
cout<<"请按顺序输入增广矩阵 a:"<<endl;
load();
for(i=0;i<m;i++)
{
for(j=i;j<m;j++)
c=(fabs(a[j][i])>fabs(a[i][i]))?j:i; /*找列最大元素*/
for(n=0;n<m+1;n++)
{s=a[i][n]; a[i][n]=a[c][n]; a[c][n]=s;} /*将列最大数防在对角线上*/
for(p=0;p<m+1;p++)
cout<<a[i][p]<<"\t";

cout<<endl;
for(k=i+1;k<m;k++)
{
l[k][i]=a[k][i]/a[i][i];
for(r=i;r<m+1;r++) /*化成三角阵*/
a[k][r]=a[k][r]-l[k][i]*a[i][r];
}
}
x[m-1]=a[m-1][m]/a[m-1][m-1];
for(i=m-2;i>=0;i--)
{
d=0;
for(j=i+1;j<m;j++)
d=d+a[i][j]*x[j];
x[i]=(a[i][m]-d)/a[i][i]; /*求解*/
}
cout<<"该方程组的解为:"<<endl;
for(i=0;i<m;i++)
cout<<"x["<<i<<"]="<<x[i]<<"\t";
//system("pause");
return 0;
}
void load()
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<m+1;j++)
cin>>a[i][j];
}
运行结果:
下面请输入未知数的个数 m=3
请按顺序输入增广矩阵 a:
1 2 3 4
5 1 0 8
4 6 9 2
4 6 9 2
0 -6.5 -11.25 5.5
0 -1.86265e-008 -0.115385 3.92308
该方程组的解为:
x[0]=-9.99999 x[1]=58 x[2]=-34 Press any key to continue
总结:列主元素消去法的目的是为了防止减去一个较小的数时大数淹没小数,而使结果产
生较大误差,本程序关键在每次消元时找到相应列中的最大项,然后交换两行位置,在进
行计算。
剩余12页未读,继续阅读
资源评论

- BelievenChanging2013-01-02很好,很好用。
- GloriaD2011-12-20算法很全,适合做北航数值分析作业的同学们

zhouyiboaa
- 粉丝: 3
- 资源: 6
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
