数值计算第一次实验(C语言版)

这篇博客记录了作者在数值计算第一次实验中的经历,实验要求使用C语言实现14种数值计算方法,包括牛顿插值法的特殊实现。教师强调函数封装和编程规范,并提供了参考模板。作者在Ubuntu 16.04上完成代码编写,代码在Windows环境下也可运行。文章分享了主要函数代码、头文件和解决Linux下数学函数问题的编译脚本。
摘要由CSDN通过智能技术生成
 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},
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值