1. 二分法方程求根
2. 顺序消元法解线性方程组
3. 列选主元消去法解线性方程组
4. 全选主元消去法解线性方程组
5. Doolittle(杜立特尔)分解
6. Crout(克洛特)分解解线性方程组
7. 平方根法法解线性方程组
8. 拉格朗日插值法
9. 牛顿插值法
10. Hermite插值法
11. 最小二乘法(线性拟合)
12. 变步长梯形求积法计算定积分
13. Romberg算法
14. 改进欧拉法
这几天数值第一次实验总算是结束了,说实话感觉老师这样布置任务还是非常可行的.首先他开始要求我们用图形化编程实验以上14个数值计算方法.而且规定牛顿插值法必须要用一维数组和秦九韶算法实现.可第一次验收的情况并不符合老师要求.于是老师要求我们对函数进行封装,一个函数可以重复多次使用.并且自己写了一个模板给我们做参考.现在大学像这样尽责的老师已经不多了.总之,老师这样对我们严格的要求,都是为了我们自己能有更严谨的编程风格和强大的编程实力
下面给出我在ubuntu16.04下编写的代码,拿到windows下也可以运行
main.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "head.h"
double f(double); //方程f(x)=0的函数
double f2(double); //变步长积分函数
void Dodichotomy(); //二分法
void Doleastsquares(); //最小二乘法
void Doshunxu(); //顺序消元法
void Doliezhu(); //列主消元法
void Doquanxuan(); //全选主元消去
void Dodoolittle(); //杜利特尔分解法
void Docrout(); //Crout(克洛特)分解解线性方程组
void Dopingfang(); //平方根法解线性方程组
void Dolagrange(); //拉格朗日插值法
void Donewton(); //牛顿插值法
void Dohermite(); //Hermite插值法
void Doleastsquares(); //最小二乘法
void Dochangestep(); //变步长梯形求积法计算定积分
void Doromberg(); //龙贝格算法
void Doeuler(); //改进欧拉算法
int main()
{
char ch;
int n;
for(;;)
{
n = Menu();
switch(n)
{
case 1:
Dodichotomy();
break;
case 2:
Doshunxu();
break;
case 3:
Doliezhu();
break;
case 4:
Doquanxuan();
break;
case 5:
Dodoolittle();
break;
case 6:
Docrout();
break;
case 7:
Dopingfang();
break;
case 8:
Dolagrange();
break;
case 9:
Donewton();
break;
case 10:
Dohermite();
break;
case 11:
Doleastsquares();
break;
case 12:
Dochangestep();
break;
case 13:
Doromberg();
break;
case 14:
Doeuler();
break;
case 15:
return 0;
default:
printf("输入错误,请重新输入\n");
break;
}
}
}
void Dodichotomy()
{
printf("%lf\n",Dichotomy(f,-4,4,1e-5));
}
void Doleastsquares()
{
double x[5] = {
1,2,3,4,5};
double y[5] = {
0,2,2,5,4};
double a,b;
LeastSquares(x,y,5,&a,&b);
printf("a = %lf;b = %lf\n",a,b);
}
double f(double x)
{
double y;
y = x*(x*(2.0*x-4.0)+3.0)-6.0;
return y;
}
void Doshunxu()
{
double a[3][3]={
2.5,2.3,-5.1,
5.3,9.6,1.5,
8.1,1.7,-4.3
};
double b[3] = {
3.7,3.8,5.5};
Shunxu(a,3,3,b);
}
void Doliezhu()
{
double a[3][3]={
2.5,2.3,-5.1,
5.3,9.6,1.5,
8.1,1.7,-4.3
};
double b[3] = {
3.7,3.8,5.5};
Liezhu(a,3,3,b);
}
void Doquanxuan()
{
double a[3][3]={
2.5,2.3,-5.1,
5.3,9.6,1.5,
8.1,1.7,-4.3
};
double b[3] = {
3.7,3.8,5.5};
Quanxuan(a,3,3,b);
}
void Dodoolittle()
{
float a[3][3] = {
1,-1,3,
2,-4,6,
4,-9,2
};
float b[4] = {
1,4,1};
Doolittle(a,3,3,b);
}
void Docrout()
{
float a[3][3] = {
1,-1,3,
2,-4,6,
4,-9,2
};
float b[4] = {
1,4,1};
Crout(a,3,3,b);
}
void Dopingfang()
{
int i;
double a[4][4] = {
{
1,2,1,-3},
{
2,5,0,-5},
{
1,0,14,1},
{
-3,-5,1,15}
};
double b[4] = {
1,2,16,8};
double d[4] = {
0};
double x[4] = {
0};
double y[4] = {
0};
double L[4][4] = {
0};
Cholesky(a,b,L,d,x,y,4);
printf("方程的解为:\n");
for(i=1;i<=4;i++)
printf("x(%d)=%f\n",i,x[i-1]);
}
void Dolagrange()
{
Point points[20] = {
{
0.56160,0.82741},{
0.56280,0.82659},
{
0.56401,0.82577},{
0.56521,0.82495}
};
Lagrange(points,4,0.5635);
}
void Donewton()
{
double b[6][7] = {
{
0.4,0.41075},
{
0.55,0.57815},
{
0.65,0.69675},