数值分析(第五版_李庆扬等_清华大学出版社)几个程序代码

本人就读于某211大学数学系,本着造福学弟学妹的原则上传了自己的代码,仅供参考
原本是专业必修课用来交作业的c语言版本,但是小学期老师要MATLAB版的,看着身边同学一个个抓耳挠腮,所以更新了MATLAB版本的代码,适用于那些不想申请A的学弟学妹。(申请A老师会细看你的代码,会发现是抄的)
同校的自然一看就懂我在说什么

牛顿插值法(课本32页例4)

c语言版本

#include <stdio.h>
#include <stdlib.h>
int main()
{
    float table(int n,float a1[10],float a2[10],float a3[10][10]);
    float newton(int n,float a4[10][10],float a5[10]);
    float arrX[10],arrY[10],arrL[10][10];
    int num,i;
    printf("请输入插值点个数(个数应小于10)");
    scanf("%d",&num);
    printf("请输入各个插值节点的值:\n");
    for(i=0; i<num; i++)
    {
        printf("请输入X%d值:",i+1);
        scanf("%f",&arrX[i]);
        printf("请输入Y%d值:",i+1);
        scanf("%f",&arrY[i]);
    }
     table(num,arrX,arrY,arrL);
     newton(num,arrL,arrX);
    return 0;
}
float table(int n,float a1[10],float a2[10],float a3[10][10])
{
    int i,j;
    for(i=0; i<n; i++)
    {
        a3[i][0]=a2[i];//第一列初始化为y值
    }
    for(j=0; j<n; j++)
        for(i=n-1; i>j; i--)//从第一列往前循环,到i=j为止,即下三角全部计算赋值
        {
            a3[i][j+1]=(a3[i][j]-a3[i-1][j])/(a1[i]-a1[i-1*(j+1)]);//差商表计算,最后一项arrX[i-1*(j+1)]角标是计算步长
        }
    for(j=1; j<n; j++)//上三角未计算赋值,系统会随机分配值给上三角的每一位,故赋值0会使差商表输出更整齐
        for(i=0; i<j; i++)
        {
            a3[i][j]=0.0;
        }
    printf("差商表为:\n");
    printf("\n");
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            if(j%n==0)//num个数一列输出
                printf("\n");
            printf("%f\t",a3[i][j]);
        }
    }
    printf("\n");
    printf("\n");
    return 0;
}
float newton(int n,float a4[10][10],float a5[10])
{
    int i;
    float x,y,t1=1.0;
    while(1)
    {
        printf("请输入要插入节点的x值:");
        scanf("%f",&x);
        y=a4[0][0];
        for(i=1; i<n; i++)
        {
            t1=t1*(x-a5[i-1]);
            y=y+a4[i][i]*t1;//差商表对角线值依次乘以(x-x0)(x-x1)。。。。。。
        }
        printf("插值结果为:%f",y);
        printf("\n");
    }
    return 0;
}

MATLAB版本(data.txt为同级目录新建文本文件,把题目已知数据输入,注意空格和换行)

close all;clc;clear;
fileID=fopen('data.txt');
A=textscan(fileID,'%s %s');
fclose(fileID);
x=A{1,1};
y=A{1,2};
format long
x=str2double(x);
y=str2double(y);
a=[x,y];
[m,n]=size(a);
a=([a zeros(m,m-n)])+zeros(m,m);
for i=2:1:m  
    for j=3:1:i+1
        a(i,j)=(a(i,j-1)-a(i-1,j-1))/(a(i,1)-a(i-j+2,1));
    end
end
a
x=input('请输入x:','s');
x=str2double(x);
n=input('请输入插值多项式的次数n:','s');
d=a(1,2);
for i=2:1:m
    b=1;
    for j=3:1:i+1
        b=(x-a(i-j+2,1))*b;
        c=a(i,j)*b;
    end
    d=d+c;
end
y=sprintf('近似的结果f(x)= %.5f',d);
disp(y)

数值积分章节的复合梯形和复合辛普森公式(课本108页例3)

c语言版本

#include "stdio.h"
#include "math.h"
void main()
{
int k;
double a,b,n1,n2,h,x;
double f,f1,f2,T,F=0.0;

printf("请输入积分区间a b:");
scanf("%lf%lf",&a,&b);
printf("请输入使用复合梯形公式时将区间划分的份数n1:");
scanf("%lf",&n1);
printf("请输入使用复合辛普森公式时将区间划分的份数n2:");
scanf("%lf",&n2);

h=(b-a)/n1;
for(k=1;k<n1;k++)
{
        x=a+k*h;
        f=sin(x)/x;
        F+=f;
}
if(a!=0.0)
f1=sin(a)/a;
else(f1=1.0);  
f2=sin(b)/b; 
T=0.5*h*(f1+2*F+f2); 
printf("\n使用复合梯形公式求得T=%0.7f",T);
double F1=0.0,F2=0.0,S=0.0;
h=(b-a)/n2;
for(k=0;k<n2;k++)
{
x=a+k*h+0.5*h; 
f=sin(x)/x; 
F1+=f; 
}
for(k=1;k<n2;k++)
{
f=0; 
x=a+k*h; 
f=sin(x)/x; 
F2+=f; 
}
if(a!=0)
f1=sin(a)/a; 
else
f1=1.0; 
f2=sin(b)/b;
S=h/6.0*(f1+4*F1+2*F2+f2); 
printf("\n使用复合辛普森公式求得S=%0.7f",S);
}

MATLAB版本

close all;clc;clear;
a=input('请输入积分下限a:','s');
a=str2double(a);
b=input('请输入积分上限b:','s');
b=str2double(b);
n1=input('请输入使用复合梯形公式时将区间划分的份数n1:','s');
n1=str2double(n1);
n2=input('请输入使用复合辛普森公式时将区间划分的份数n2:','s');
n2=str2double(n2);
F=0;
h=(b-a)/n1;
for k=1:1:n1-1
    x=a+k*h;
    f=sin(x)/x;
    F=F+f;
end
if a~=0.0
    f1=sin(a)/a;
else
    f1=1.0;
end
f2=sin(b)/b; 
T=0.5*h*(f1+2*F+f2);
y=sprintf('使用复合梯形公式求得T= %.7f',T);
disp(y)
F1=0.0;
F2=0.0;
S=0.0;
h=(b-a)/n2;
for k=0:1:n2-1
    x=a+k*h+0.5*h; 
    f=sin(x)/x; 
    F1=F1+f;
end
for k=1:1:n2-1
    f=0; 
    x=a+k*h; 
    f=sin(x)/x; 
    F2=F2+f;
end
if a~=0
    f1=sin(a)/a; 
else
    f1=1.0; 
end
f2=sin(b)/b;
S=h/6.0*(f1+4*F1+2*F2+f2); 
y=sprintf('使用复合辛普森公式求得S= %.7f',S);
disp(y)

线性方程组的直接解法之追赶法(书177页习题9)

c语言版本

#include "stdio.h"
#include "math.h"
#define n 5
void main()
{
    float a[n]={0,-1,-1,-1,-1},b[n]={2,2,2,2,2},c[n]={-1,-1,-1,-1,0},
        s[n],t[n],temp=0,x[n]={1,0,0,0,0};
    int k;
    for(k=0;k<n;k++)
    {
        s[k]=b[k]-a[k]*temp;
        t[k]=c[k]/s[k];temp=t[k];
    }
    temp=0;
    for(k=0;k<n;k++)
    {
        x[k]=(x[k]-a[k]*temp)/s[k];
        temp=x[k];
    }
    for(k=n-2;k>=0;k--)
        x[k]=x[k]-t[k]*x[k+1];
    printf("\nx= \n");
    for(k=0;k<n;k++)
        printf(" %f \n",x[k]);
}

MATLAB版本(data1.xlsx、data2.xlsx为A和b,下同,其实这是正确导入数据的方式,第一个程序里用txt文件存数据不规范)

close all;clc;clear;
A = xlsread('data1.xlsx');
x = xlsread('data2.xlsx');
[m,n]=size(A);
a=[0;diag(A,-1)];
b=diag(A,0);
c=[diag(A,1);0];
temp=0;
for k=1:1:m
    s(k,1)=b(k,1)-a(k,1)*temp;
    t(k,1)=c(k,1)/s(k,1);
    temp=t(k,1);
end 
temp=0;
for k=1:1:m
    x(k,1)=(x(k,1)-a(k,1)*temp)/s(k,1);
    temp=x(k,1);
end
for k=n-1:-1:1
    x(k,1)=x(k,1)-t(k,1)*x(k+1,1);
end
sprintf(' %.6f',x)

线性方程组的迭代法之高斯-赛德尔迭代法(课本189页例6)

c语言版本

#include "stdio.h"
#include "math.h"
#define n 3
void main()
{
    float A[n][n]={{8,-3,2},{4,11,-1},{6,3,12}},
        b[n]={20,33,36},x[n]={0.0,0.0,0.0},epsilon,normal,temp,t;
    int N,i,j,k;
    printf("\n 精度 = ");  scanf("%f",&epsilon);
    printf("\n 最大迭代精度N = "); scanf("%d",&N);

    printf("\n %d : ",0);
    for(i=0;i<n;i++)
        printf("%f",x[i]);
    for(k=0;k<N;k++)
    {
        normal=0;

        for(i=0;i<n;i++)
        {
            t=x[i];
            x[i]=b[i];
            for(j=0;j<n;j++)
                if(j!=i)
                    x[i]=x[i]-A[i][j]*x[j];
            x[i]=x[i]/A[i][i];
            temp=fabs(x[i]-t);
            if(temp>normal)
                normal=temp;
        }
        printf("\n %d :",k+1);
        for(i=0;i<n;i++)
            printf(" %f",x[i]);
        if(normal<epsilon)
        {
            printf("\n");
            return;
        }
    }

    printf("\n \n迭代%d次后仍未求得满足精度的解\n",N);
}

MATLAB版本

close all;clc;clear;
A = xlsread('data1.xlsx');
b = xlsread('data2.xlsx');
[m,n]=size(A);
x=[0;0;0];
e=input('请输入精度e:','s');
e=str2double(e);
N=input('请输入最大迭代精度N:','s');
N=str2double(N);
for i=1:1:m
    sprintf('%f',x(i,1))
end
for k=1:1:N
        normal=0;
        for i=1:1:m
            t=x(i,1);
            x(i,1)=b(i,1);
            for j=1:1:m
                if j~=i
                    x(i,1)=x(i,1)-A(i,j)*x(j,1);
                end
            end
            x(i,1)=x(i,1)/A(i,i);
            temp=abs(x(i,1)-t);
            if(temp>normal)
                normal=temp;
            end
        end
        for i=1:1:m
              sprintf('%f',x(i,1))  
        end
        if normal<e
            return;
        end         
end

常微分初值问题三种数值解法(课本284页例2三种解法)

c语言版本

#include "stdio.h"
#include "math.h"

//
#define f(x,y) ((y)-2*(x)/(y))
#define y(x) sqrt(1+2*(x))
void main()
{
    float a=0,b=1.0f,h=0.1f,y0=1.0f,x,ye,yp,ym,k1,k2,k3,k4,yr,yx;

    printf("\n       欧拉方法");
    printf("  改进欧拉方法  四阶龙格库塔方法");
    printf("\nx          ye[k]     ");
    printf("ym[k]      yr[k]  \n");
    printf("%3.1f    %9.6f  ",a,0);
    printf("%9.6f  %9.6f  \n",y0,y0);

    x=a;
    ye=y0;
    ym=y0;
    yr=y0;

    while(x<b)
    {
        ye=ye+h*f(x,ye);
        yp=ym+h*f(x,ym);
        ym=ym+h/2*(f(x,ym)+f(x+h,yp));

        k1=f(x,yr);
        k2=f(x+h/2,yr+h/2*k1);
        k3=f(x+h/2,yr+h/2*k2);
        k4=f(x+h,yr+h*k3);
        yr=yr+h/6*(k1+2*k2+2*k3+k4);

        x=x+h;
        yx=y(x);
        
        printf("%3.1f    %9.6f  %9.6f  %9.6f  \n"
            ,x,ye,ym,yr);


    }
}

MATLAB版本

f.m
function f = f(x,y)
    f = ((y)-2*(x)/(y));
end
y.m
function y = y( x )
    y = sqrt(1+2*(x));
end
主程序(记得把上面两个文件放在同级目录,我真是操碎了心)
close all;clc;clear;
a=0;b=0.9;h=0.1;y0=1;
x=a;
ye=y0;
ym=y0;
yr=y0;
while(x<=b)
        ye=ye+h*f(x,ye);
        yp=ym+h*f(x,ym);
        ym=ym+h/2*(f(x,ym)+f(x+h,yp));
        k1=f(x,yr);
        k2=f(x+h/2,yr+h/2*k1);
        k3=f(x+h/2,yr+h/2*k2);
        k4=f(x+h,yr+h*k3);
        yr=yr+h/6*(k1+2*k2+2*k3+k4);
        x=x+h;
        yx=y(x);
        fprintf(' %.6f %.6f %.6f\n',ye,ym,yr)
end
sprintf('三列分别为欧拉方法、改进的欧拉方法、四阶龙格库塔方法\n每行对应的x从0.1开始以h=0.1跃进到1,共10行')

记录两个小坑

牛顿插值法的MATLAB版本里有一个下标是j-i+2,达到的目的是下标非负取整,具体逻辑要想清楚
要用getchar把input的变为数字,不然是字符会有问题,使用str2double也行不过一般是getchar

最后的一些想法

估计可爱的学弟学妹copy完代码就直接关了,有能力的也不稀罕这些不是很专业的代码。
c语言版本的是从一本书上参考的(忘了叫啥名字了,但挺有年代感的是零几年的,在学校图书馆里吃灰),MATLAB版本是我照着c语言版本自己“翻译”的,水平明显比不上,但都可以跑的通可以正确运行。
再多说点,好像是在一个问答里看到的,说,数学系的同学要具备代码能力,这种能力不是说要像计科的同学一样,考虑复杂度啊代码可读性啊换行啊什么特别专业的,但是处理数据完成你想要完成的能力还是必须要有的,希望数学系同志们在未来的日子里共同持续进化
共勉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • 何谓数值分析? 众所周知现实生活中科学技术上面的问题大多数都能够通过建立对应的数学模型把实际问题转化成一个数学问题...
    罗泽坤阅读 8,828评论 0 14
  • 研究生时,极其不喜欢数值分析,觉得太抽象。 结果研究生也没研究出什么,没有能够用好数学这个工具,这也成了心里一个结...
    建_5f75阅读 973评论 0 2
  • 最近一段时间在复习数值计算相关内容,也恰逢简书断更了,不用每天督促着自己非要更出点什么东西才好,有更多的空间来打磨...
    抄书侠阅读 1,244评论 0 6
  • 考试科目:高等数学、线性代数、概率论与数理统计 考试形式和试卷结构 一、试卷满分及考试时间 试卷满分为150分,考...
    Saudade_lh阅读 1,076评论 0 0
  • 考试形式和试卷结构一、试卷满分及考试时间 试卷满分为150分,考试时间为180分钟 二、答题方式 答题方式为闭卷、...
    幻无名阅读 751评论 0 3