计算方法实验+编程代码
计算方法(各种方法的程序源代码)
第一章求根公式法:#include<stdio.h>#include<math.h>main(){int a,b,c;double x1,x2,d=0.0;printf("请输入a,b,c的值:\n");scanf("%d,%d,%d",&a,&b,&c);d=b*b-4*a*c;if(d>=0){if(d>0){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}else{ x1=-b/(2*a);x2=x1;printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}}else{printf("方程无实根\n");}return 0;}二分法:#include<stdio.h>#include<math.h>double f(double x){double y;y=x*x*x-2*x-5;return y;}main(){double a=2.0,b=3.0,x;if(f(a)*f(b)<0.0){do{x=(a+b)/2.0;if(f(a)*f(x)<0.0){b=x;continue;}if(f(x)*f(b)<0.0)a=x;}while(fabs(a-b)>0.01);}else printf("没有实根");printf("实根为%f",x);return 0;}第二章拉格朗日插值:#include <iostream>#include <iomanip>#include <stdlib.h>using namespace std;#define N 100void lagrange(){int n,k,m,q=1;float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;cout<<"请输入X的个数:";cin>>n;for(k=0;k<=n-1;k++){cout<<"请输入X"<<k<<"的值:";cin>>x[k];cout<<"请输入Y"<<k<<"的值:";cin>>y[k];}system("cls");cout<<"则Xi与Yi表格如下:"<<endl;cout<<"Xi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<x[k]; cout<<endl;cout<<"Yi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<y[k]; cout<<endl;while(q){cout<<"请输入所求x的值:";cin>>xx;while(xx>x[k-1]||xx<x[0]){cout<<"输入错误,请重新输入:";cin>>xx;}for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m] ));cout<<"则拉格朗日分段线性插值为:"<<yyy1<<endl;for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}if((xx-x[m])>(x[m+1]-xx))m=m+1;else m=m;yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1])); yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1])); yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m])); yyy2=yy1+yy2+yy3;cout<<"则拉格朗日分段二次插值为:"<<yyy2<<endl;cout<<"是否输入其余要求x的值[是(1),否(0)]:";cin>>q;}system("cls");}void main(){lagrange();}牛顿插值:#include<stdio.h>#include<math.h>main(){float a[]={0,1,2,3,4},b[]={3,6,11,18,27};float f[5],x,t,m,n,s=0;int i,j,k,l;printf("请输入x的值:");scanf("%f",&x);f[0]=b[0];for(i=1;i<5;i++){m=0;for(j=0;j<=i;j++){t=1;for(k=0;k<=i;k++){if(k!=j) t=t/(a[j]-a[k]);}m=m+b[j]*t;}n=1;for(l=0;l<i;l++) n=n*(x-a[l]);s=s+m*n;}s=s+f[0];printf("s=%f",s);return 0;}线性和二次插值法:#include<stdio.h>#include<math.h>main(){floata[]={0.4,0.5,0.6,0.7,0.8,0.9},b[]={-0.916291,-0.693147,-0.510826,-0.3566 75,-0.223144,-0.105361};float x,t,m,p1=0.0,p2=0.0,p3=0.0;int i,j;printf("请输入x的值");scanf("%f",&x);for(i=0;i<2;i++){t=0.0;for(j=0;j<2;j++){if(j!=i) t=t+((x-a[j])/(a[i]-a[j]))*b[i];}p1=p1+t;}printf("线性插值的结果为:%f",p1);for(i=0;i<3;i++){m=1.0;for(j=0;j<3;j++){if(j!=i) m=m*((x-a[j])/(a[i]-a[j]));}p2=p2+m*b[i];}printf("取0.4,0.5,0.7,的二次插值的结果为:%f",p2); for(i=1;i<4;i++){m=1.0;for(j=1;j<4;j++){if(j!=i) m=m*((x-a[i])/(a[i]-a[j]));}p3=p3+m*b[i];}printf("取0.5,0.6,0.7的二次插值的结果为:%f",p3);return 0;}直线拟合法:#include<stdio.h>#include<math.h>main(){float X[5]={-2,-1,0,1,2},Y[5]={0,0.2,0.5,0.8,1.0}; float a=0,b=0,c=0,d=0,m,n;int i;for(i=0;i<5;i++){a=a+X[i];b=b+Y[i];c=c+X[i]*X[i];d=d+X[i]*Y[i];};m=(b*c-a*d)/(5*c-a*a);n=(5*d-c*a)/(5*c-a*a);float x,y;printf("请输入X的值");scanf("%f",&x);y=m+n*x;printf("拟合后代入x的值得出的结果为:%f",y); return 0;}第三章复化辛甫生算法:#include<stdio.h>#include<math.h>float f(float x){float y;y=3*x*x+2*x;return y;}main(){float a,b,h,s;int k=1,n;printf("请输入a,b,n");scanf("%f,%f,%d",&a,&b,&n);h=(b-a)/n;s=f(b)-f(a);for(float x=a;k<n;k++){x=x+h/2;s=s+4*f(x);x=x+h/2;s=s+2*f(x);}s=(h/6)*s;printf("s=%f",s);}龙贝格算法:#include<stdio.h>#include<string.h>#include<math.h>#include<conio.h>#include<stdlib.h>float f(float x){return (2*x);}float r(float a,float b){int k=1;float s,x,t1,t2,s1,s2,c1,c2,r1,r2,h=b-a,p;t1=h*(f(a)+f(b))/2;while(1){s=0;x=a+h/2;do{s+=f(x);x+=h;}while(x<b);t2=(t1+h*s)/2.0;if(fabs(t2-t1)<p)return(t2);s2=t2+(t2-t1)/3.0;if(k==1){t1=t2;s1=s2;h/=2;k+=1;continue;}c2=s2+(s2-s1)/15.0;if(k==2){c1=c2;t1=t2;s1=s2;h/=2.0;k+=1;continue;}r2=c2+(c2-c1)/63;if(k==3){r1=r2;c1=c2;t1=t2;s1=s2;h/=2;k+=1;continue;};if(fabs(s1-s2)<p)return(s2);r1=r2;c1=c2;t1=t2;s1=s2;h/2;k+=1;return(r1);}}main(){int i;float a,b,p,s,clrsca();printf("\n input integrate f(x) the begin:");scanf("%f",&a);printf("\n input integrate f(x) the end:"); scanf("%f",&b);printf("\n input p:");scanf("%f",&p);s=r(a,b);printf("the result is:%f",s);getch();return(s);}变步长积分法:#include<stdio.h>#include<math.h>void main(){double k,a,b;int kk,n;double sum[100],t[100];printf("方程为f(x)=x/(4+x^2),积分区间为[0,1]\n");printf("请输入预定精度a的值\n");scanf("%lf",&a);t[0]=0.1;t[1]=0.1088;for(k=1.0,kk=1;fabs(t[kk]-t[kk-1])>=a;k++,kk++){for(n=1,sum[kk+1]=0;n<=pow(2.0,k);n++){b=(2*n-1)/pow(2.0,k+1);sum[kk+1]+=b/(4+b*b);}t[kk+1]=0.5*t[kk]+(1/pow(2.0,k+1))*sum[kk+1];}printf("\n方程利用变步长梯形法积分后的积分值为%f\n",t[kk]);}第四章:欧拉法:#include<stdio.h>#include<math.h>#include<string.h> #include<stdlib.h> float f(float x,float y){ float f;f=x+y;return f;};main(){float x[6],y[6],h;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;y[n]=y[0]+h*f(x[0],y[0]);printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}改进欧拉法:#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>float f(float x,float y){float f;f=x+y;return f;};main(){float x[6],y[6],h,yp,ye;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;yp=y[0]+h*f(x[0],y[0]);ye=y[0]+h*f(x[n],yp);y[n]=(yp+ye)/2;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}四阶龙格库塔法:#include<stdio.h>#include<math.h>#include<string.h>float f(float x,float y){float f;f=x+y;return f;}main(){float x[11],y[11],h,k1,k2,k3,k4;printf("请分别输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(int n=1;n<11;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;k1=f(x[0],y[0]);k2=f(x[0]+h/2,y[0]+h*k1/2);k3=f(x[0]+h/2,y[0]+h*k2/2);k4=f(x[n],y[0]+h*k3);y[n]=y[0]+h*(k1+2*k2+2*k3+k4)/6;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}第六章迭代法:#include<stdio.h>#include<math.h>#include<string.h>double F1(double x);double Newton(double x0, double e); int main(){double x0 = 0.5;double e = 10E-6;printf("x = %f\n", Newton(x0, e));getchar();return 0;}double F1(double x){return log(x+2)/log(10);}double Newton(double x0, double e) {double x1;do{x1 = x0;x0 =F1(x1);} while (fabs(x0 - x1) > e);return x0;}埃特金加速法:#include<stdio.h>#include<conio.h>#include<math.h>#define h 1.E-10 double f(double x0) {x0=exp(-x0);return x0;}double sub(double x) {if(x>=0)return x;else return -x;}main(){double x0=0.5,x,s=0.0; do{x=f(x0);s=sub(x-x0);x0=x;}while(s>h); printf("x=%f",x); getch();return 0;}快速弦截法:#include<stdio.h>#include <math.h>float f(float x){float y;y=x*exp(x)-1;return (y);}float xpoint(float x1,float x2){float y;y=(x1*f(x2)-x2*f(x1)) / (f(x2) - f(x1));return (y) ;}float root(float x1, float x2) {int i;float x,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0000001); return (x);}main(){float x1,x2,f1,f2,x;do{printf("input x1,x2:\n");scanf("%f,%f",&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf("A root of equation is %8.4f\n",x); }第七章高斯消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],m[10][10],x[10],sum; int i,j,k,n;printf("the top exp:");scanf("%d",&n);printf("\n");for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%f",&a[i][j]);}for(i=0;i<n;i++){scanf("%f",&b[i]);}for(k=0;k<n-1;k++){if(a[k][k]==0)printf("error");else {for(i=k+1;i<n;i++){m[i][k]=a[i][k]/a[k][k];} };a[i][k]=m[i][k];b[i]=b[i]-m[i][k]*b[k];for(j=k+1;j<n;j++)a[i][j]=a[i][j]-m[i][k]*a[k][j];};if(a[n-1][n-1]==0)printf("error");else x[n-1]=b[n-1]/a[n-1][n-1];b[n-1]=x[n-1];for(i=n-2;i>=0;i--){sum=0;for(j=i+1;j<n;j++){sum+=a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];b[i]=x[i];}for(i=0;i<n;i++)printf("%f\n",x[i]);}return 0;}选主元消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],s,t,e,sum; int i,j,k,n,m;printf("The top exp is "); scanf("%d",&n);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);for(i=0;i<n;i++)scanf("%f",&b[i]);scanf("%f",&e);k=0;do{t=a[k][k];for(i=k;i<n;i++){if(fabs(t)<fabs(a[i][k])){t=a[i][k];m=i;}else m=k;}if(fabs(t)<e)printf("det A = 0\n");else {if(m!=k){for(j=0;j<n;j++){s=a[m][j];a[m][j]=a[k][j];a[k][j]=s;}s=b[m];b[m]=b[k];b[k]=s;}for(i=k+1;i<n;i++)for(j=k+1;j<n;j++){a[i][k]=a[i][k]/a[k][k];a[i][j]=a[i][j]-a[i][k]*a[k][j];b[i]=b[i]-a[i][k]*b[k];}}k++;}while(k<n-2);if(fabs(a[n-1][n-1])<e)printf("det A = 0\n");else {b[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){sum=0;for(k=i+1;k<n;k++){sum+=a[k][j]*b[j];}b[i]=(b[i]-sum)/a[i][i];}}for(i=0;i<n;i++)printf("%f\n",b[i]);}追赶法:#include<stdio.h>#include<math.h>main(){int i,j,k,n;float d[10][10],g[10],a[10],b[10],c[10],x[10],y[10],f[10];printf("the top exp is ");scanf("%d",&n);scanf("%f,%f,%f,%f",&d[0][0],&d[0][1],&d[n-1][n-2],&d[n-1][n-1]); for(i=1;i<n-1;i++)for(j=i-1;j<=i+1;j++)scanf("%f",&d[i][j]);for(i=0;i<n;i++)scanf("%f",&g[i]);for(i=1;i<n-1;i++)a[i]=d[i][i-1];for(i=0;i<n;i++)b[i]=d[i][i];for(i=0;i<n-1;i++)c[i]=d[i][i+1];f[0]=c[0]/b[0];for(k=1;k<n-1;k++)f[k]=c[k]/(b[k]-a[k]*f[k-1]);y[0]=g[0]/b[0];for(i=1;i<n;i++)y[i]=(g[i]-a[i]*y[i-1])/(b[i]-a[i]*f[i-1]); x[n-1]=y[n-1];for(i=n-2;i>=0;i--)x[i]=y[i]-f[i]*x[i+1];for(i=0;i<n;i++)printf("%f\n",x[i]);}。
计算方法实验报告
班级:地信11102班序号: 20姓名:任亮目录计算方法实验报告(一) (3)计算方法实验报告(二) (6)计算方法实验报告(三) (9)计算方法实验报告(四) (13)计算方法实验报告(五) (18)计算方法实验报告(六) (22)计算方法实验报告(七) (26)计算方法实验报告(八) (28)计算方法实验报告(一)一、实验题目:Gauss消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯消去法基础原理2、掌握高斯消去法法解方程组的步骤3、能用程序语言对Gauss消去法进行编程实现四、实验过程代码及结果1、实验算法及其代码模块设计(1)、建立工程,建立Gauss.h头文件,在头文件中建类,如下:class CGauss{public:CGauss();virtual ~CGauss();public:float **a; //二元数组float *x;int n;public:void OutPutX();void OutputA();void Init();void Input();void CalcuA();void CalcuX();void Calcu();};(2)、建立Gauss.cpp文件,在其中对个函数模块进行设计2-1:构造函数和析构函数设计CGauss::CGauss()//构造函数{a=NULL;x=NULL;cout<<"CGauss类的建立"<<endl;}CGauss::~CGauss()//析构函数{cout<<"CGauss类撤销"<<endl;if(a){for(int i=1;i<=n;i++)delete a[i];delete []a;}delete []x;}2-2:函数变量初始化模块void CGauss::Init()//变量的初始化{cout<<"请输入方程组的阶数n=";cin>>n;a=new float*[n+1];//二元数组初始化,表示行数for(int i=1;i<=n;i++){a[i]=new float[n+2];//表示列数}x=new float[n+1];}2-3:数据输入及输出验证函数模块void CGauss::Input()//数据的输入{cout<<"--------------start A--------------"<<endl;cout<<"A="<<endl;for(int i=1;i<=n;i++)//i表示行,j表示列{for(int j=1;j<=n+1;j++){cin>>a[i][j];}}cout<<"--------------- end --------------"<<endl;}void CGauss::OutputA()//对输入的输出验证{cout<<"-----------输出A的验证-----------"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++){cout<<a[i][j]<<" ";}cout<<endl;}cout<<"---------------END--------------"<<endl;}2-4:消元算法设计及实现void CGauss::CalcuA()//消元函数for(int k=1 ;k<n;k++){for(int i=k+1;i<=n;i++){double lik=a[i][k]/a[k][k];for(int j=k;j<=n+1;j++){a[i][j]-=lik*a[k][j];}a[i][k]=0; //显示消元的效果}}}2-5:回代计算算法设计及函数实现void CGauss::CalcuX()//回带函数{for(int i=n;i>=1;i--){double s=0;for(int j=i+1;j<=n;j++){s+=a[i][j]*x[j];}x[i]=(a[i][n+1]-s)/a[i][i];}}2-6:结果输出函数模块void CGauss::OutPutX()//结果输出函数{cout<<"----------------X---------------"<<endl;for(int i=1 ;i<=n;i++){cout<<"x["<<i<<"]="<<x[i]<<endl;}}(3)、“GAUSS消元法”主函数设计int main(int argc, char* argv[]){CGauss obj;obj.Init();obj.Input();obj.OutputA();obj.CalcuA();obj.OutputA();obj.CalcuX();obj.OutPutX();//obj.Calcu();return 0;2、实验运行结果计算方法实验报告(二)一、实验题目:Gauss列主元消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯列主元消去法基础原理(1)、主元素的选取(2)、代码对主元素的寻找及交换2、掌握高斯列主元消去法解方程组的步骤3、能用程序语言对Gauss列主元消去法进行编程实现四、实验过程代码及结果1、实验算法及其代码模块设计(1)、新建头文件CGuassCol.h,在实验一的基础上建立类CGauss的派生类CGuassCol公有继承类CGauss,如下:#include "Gauss.h"//包含类CGauss的头文件class CGaussCol:public CGauss{public:CGaussCol();//构造函数virtual ~CGaussCol();//析构函数public:void CalcuA();//列主元的消元函数int FindMaxIk(int k);//寻找列主元函数void Exchange(int k,int ik);//交换函数void Calcu();};(2)、建立CGaussCol.cpp文件,在其中对个函数模块进行设计2-1:头文件的声明#include "stdafx.h"#include "CGuassCol.h"#include "math.h"#include "iostream.h"2-2:派生类CGaussCol的构造函数和析构函数CGaussCol::CGaussCol()//CGaussCol类构造函数{cout<<"CGaussCol类被建立"<<endl;}CGaussCol::~CGaussCol()//CGaussCol类析构函数{cout<<"~CGaussCol类被撤销"<<endl;}2-3:高斯列主元消元函数设计及代码实现void CGaussCol::CalcuA()//{for(int k=1 ;k<n;k++){int ik=this->FindMaxIk(k);if(ik!=k)this->Exchange(k,ik);for(int i=k+1;i<=n;i++){float lik=a[i][k]/a[k][k];for(int j=k;j<=n+1;j++){a[i][j]-=lik*a[k][j];}}}}2-4:列主元寻找的代码实现int CGaussCol::FindMaxIk(int k)//寻找列主元{float max=fabs(a[k][k]);int ik=k;for(int i=k+1;i<=n;i++){if(max<fabs(a[i][k])){ik=i;max=fabs(a[i][k]);}}return ik;}2-5:主元交换的函数模块代码实现void CGaussCol::Exchange(int k,int ik)//做交换{for(int j=k;j<=n+1;j++){float t=a[k][j];a[k][j]=a[ik][j];a[ik][j]=t;}}(3)、建立主函数main.cpp文件,设计“Gauss列主元消去法”主函数模块3-1:所包含头文件声明#include "stdafx.h"#include "Gauss.h"#include "CGuassCol.h"3-2:主函数设计int main(int argc, char* argv[]){CGaussCol obj;obj.Init();//调用类Gauss的成员函数obj.Input();//调用类Gauss的成员函数obj.OutputA();//调用类Gauss的成员函数obj.CalcuA();obj.OutputA();obj.CalcuX();obj.OutPutX();return 0;}2、实验结果计算方法实验报告(三)一、实验题目:Gauss完全主元消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯完全主元消去法基础原理;2、掌握高斯完全主元消去法法解方程组的步骤;3、能用程序语言对Gauss完全主元消去法进行编程(C++)实现。
用语言编写的加减乘除计算器程序
用语言编写的加减乘除计算器程序下面是一个使用Python编写的加减乘除计算器程序,超过1200字。
请注意,这是一个基本的计算器程序,可能还有一些功能可以改进和扩展。
你可以根据自己的需求进行修改和增加功能。
```python#定义加法函数def add(x, y):return x + y#定义减法函数def subtract(x, y):return x - y#定义乘法函数def multiply(x, y):return x * y#定义除法函数def divide(x, y):#检查除数是否为0if y == 0:return "除数不能为0"else:return x / y#打印菜单选项def print_menu(:print("欢迎使用加减乘除计算器")print("1. 相加")print("2. 相减")print("3. 相乘")print("4. 相除")print("5. 退出")#主函数def main(:while True:print_menuchoice = input("请选择操作(1/2/3/4/5):") #获取用户的选择if choice in ['1', '2', '3', '4']:num1 = float(input("请输入第一个数字:")) num2 = float(input("请输入第二个数字:"))#根据用户选择的操作调用相应的函数if choice == '1':print("结果:", add(num1, num2))elif choice == '2':print("结果:", subtract(num1, num2))elif choice == '3':print("结果:", multiply(num1, num2))else:print("结果:", divide(num1, num2))elif choice == '5':print("感谢使用加减乘除计算器!")breakelse:print("无效的选择,请重新输入。
c语言计算的代码
c语言计算的代码使用C语言进行计算的代码在计算机编程中,C语言是一种非常常用的编程语言,它具有高效、灵活和可移植等特点。
在C语言中,我们可以使用各种算法和公式来进行各种数学计算,下面就来介绍一些常见的使用C语言进行计算的代码。
一、基本的四则运算在C语言中,我们可以使用加减乘除等基本算术运算符来进行四则运算。
例如,我们可以使用以下代码来实现两个数的相加运算:```#include <stdio.h>int main() {int a = 10;int b = 20;int sum = a + b;printf("两个数的和为:%d\n", sum);return 0;}```二、求平方根在数学中,我们经常需要求一个数的平方根。
在C语言中,我们可以使用math.h头文件中的sqrt()函数来实现求平方根的功能。
下面是一个简单的例子:```#include <stdio.h>#include <math.h>int main() {double num = 16.0;double result = sqrt(num);printf("16的平方根为:%f\n", result);return 0;}```三、求阶乘阶乘是数学中常见的一个概念,表示从1到某个数之间所有整数的乘积。
在C语言中,我们可以使用循环结构来计算阶乘。
下面是一个计算阶乘的例子:```#include <stdio.h>int main() {int n = 5;int result = 1;for (int i = 1; i <= n; i++) {result *= i;}printf("5的阶乘为:%d\n", result);return 0;}```四、求最大公约数最大公约数是两个数中最大的能够同时整除两个数的数。
计算方法实验报告代码和结果
一、1.分段线性差值函数代码:function y=fdxx(x0,y0,x)%定义函数p=length(y0);n=length(x0);m=length(x);if p~=n error('数据输入有误,请重新输入');elsefprintf('分段线性差值\n');for t=1:mz=x(t);if z<x0(1)||z>x0(n)fprintf('x(%d)超出范围;\n',t);break;%若x不在函数表范围内则插值结果不准确endfor i=1:n-1if z<x0(i+1)break;%选取合适的两点使x(i)<x<x(i+1)endend%若x不再函数表范围内,则i=n-1y(t)=y0(i)*(z-x0(i+1))/(x0(i)-x0(i+1))+y0(i+1)*(z-x0(i))/(x0(i+1)-x0( i));%按照分段线性插值公式求解yfprintf('y(%d)=%f\nx1=%.3f,y1=%.3f,x2=%.3f,y2=%.3f\n\n',t,y(t),x0(i), y0(i),x0(i+1),y0(i+1));%输出插值结果和所需节点endend结果展示:>> x0=[0.0 0.1 0.195 0.3 0.401 0.5];>> y0=[0.39894 0.39695 0.39142 0.38138 0.36812 0.35206];>> x=[0.15 0.31 0.47];>> y1=fdxx(x0,y0,x)分段线性差值y(1)=0.394039x1=0.100,y1=0.397,x2=0.195,y2=0.391y(2)=0.380067x1=0.300,y1=0.381,x2=0.401,y2=0.368y(3)=0.356927x1=0.401,y1=0.368,x2=0.500,y2=0.352y1 =0.3940 0.3801 0.3569时间复杂度Elapsed time is 0.007477 seconds.2.分段二次差值函数代码:function y=fd2(x0,y0,x)%定义函数分段二次插值p=length(y0);n=length(x0);m=length(x); %计算函数表和x的长度if p~=n error('数据输入有误,请重新输入');%若函数表的x与y长度不一致则输入有误elsefprintf('分段二次差值\n\n');for t=1:m %运用循环求解所有点的插值z=x(t);if z<x0(1)|z>x0(n)fprinf('x(%d)超出范围;\n',t);break;%如果x不在函数表范围内无法插值endi=n-1; %若下列循环i不变,则i=n-1,for j=1:n-2if z<(x0(j+1)+x0(j))/2i=j;endend%选取i使得x(i-1),x(i),x(i+1)是距x最近的三个点s=0.0;for k=i-1:i+1p=1;for l=i-1:i+1if l~=kp=p*(z-x0(l))/(x0(k)-x0(l));endends=s+y0(k)*p;end%根据分段二次插值公式求yy(t)=s;fprintf('y(%d)=%f\nx1=%.3f y1=%.3f\nx2=%.3f y2=%.3f\nx3=%.3fy3=%.3f\n\n',t,y(t),x0(i-1),y0(i-1),x0(i),y0(i),x0(i+1),y0(i+1));%输出结果和所需节点endend结果展示:>> y=fd2(x0,y0,x)分段二次差值y(1)=0.394554x1=0.195 y1=0.391x2=0.300 y2=0.381x3=0.401 y3=0.368y(2)=0.380225x1=0.195 y1=0.391x2=0.300 y2=0.381x3=0.401 y3=0.368y(3)=0.357247x1=0.300 y1=0.381x2=0.401 y2=0.368x3=0.500 y3=0.352y =0.3946 0.3802 0.3572时间复杂度Elapsed time is 0.005265 seconds.3.全区间拉格朗日差值函数代码:function y=lagrange(x0,y0,x) %定义函数p=length(y0);n=length(x0);m=length(x); %计算函数表和x的长度if p~=n error('数据输入有误,请重新输入');%若函数表的x与y长度不一致则输入有误elsefprintf('拉格朗日插值\n');for t=1:m %利用循环计算每个x的插值s=0.0;z=x(t);for k=1:np=1;for i=1:nif i~=kp=p*(z-x0(i))/(x0(k)-x0(i));endends=s+y0(k)*p;end%根据拉格朗日插值公式求解yy(t)=s;fprintf('y(%d)=%f\n',t,y(t)); %输出插值结果endend结果展示:>> y=lagrange(x0,y0,x)拉格朗日插值y(1)=0.394473y(2)=0.380219y(3)=0.357222y =0.3945 0.3802 0.3572时间复杂度Elapsed time is 0.004149 seconds.二、最小二乘法函数代码:%最小二乘拟合%a为线性拟合中的常数,b为一次项系数%t为均方方差,maxi为最大偏差function [a,b,t,maxi]=polyfit(x0,y0,n)m=length(x0); p=length(y0); %x0和y0长度不等时,报错if m~=pfprintf('Error! Please input again!\n');end%生成中间矩阵Cfor i=1:mC(i,1)=1;for j=2:n+1C(i,j)=x0(i)*C(i,j-1);endend%生成系数矩阵AA=C'*C;%将题目中的y的每项求自然对数后得到y1for i=1:my1(i)=log(y0(i));end%生成法方程组的右端向量BB=C'*y1';%求解拟合系数X=A\B;%题中,a=exp(X(1)),b=X(2)a=exp(X(1)); b=X(2);%先求偏差平方和,再求均方误差sum=0;for k=1:my2(k)=a*exp(b*x0(k));l(k)=y0(k)-y2(k);sum=sum+l(k).^2;endt=sqrt(sum);%最大偏差为偏差矩阵中绝对值最大的一项maxi=max(max(abs(l)));end结果展示:>> x=1:19;>> y=[0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8];>> [a b t max]=polyfit(x,y,1)a =0.6814b =0.2306t =38.3255max =27.3047时间复杂度:>> tic;[a b t max]=polyfit(x,y,1);tocElapsed time is 0.000591 seconds.直观展示代码:>> x=1:19;>> y=[0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8];>> for i=1:19y0(i)=log(y(i));end>> x0=0:0.01:20;>> y1=0.6814*exp(0.2306*x0);>> plot(x,y,'+')>> hold on>> plot(x0,y1)>> plot(x,y0,'+')>> y2=log(0.6814)+0.2306*x0;>> hold on>> plot(x0,y2,'-')图像展示:4.实验程序:function S=csfit(x,y,dx0,dxn)%x,y分别为n个节点的横坐标所组成的向量及纵坐标组成的向量%dx0,dn分别为S的导数在x0与xn处的值n=length(x)-1;h=diff(x);d=diff(y)./h;a=h(2:n-1);b=2*(h(1:n-1)+h(2:n));c=h(2:n);u=6*diff(d);b(1)=b(1)-h(1)/2;u(1)=u(1)-3*(d(1)-dx0);for k=2:n-1temp=a(k-1)/b(k-1);b(k)=b(k)-temp*c(k-1);u(k)=u(k)-temp*u(k-1);endm(n)=u(n-1)/b(n-1);for k=n-2:-1:1m(k+1)=(u(k)-c(k)*m(k+2))/b(k);endm(1)=3*(d(1)-dx0)/h(1)-m(2)/2;m(n+1)=3*(dxn-d(n))/h(n)-m(n)/2;for k=0:n-1S(k+1,1)=(m(k+2)-m(k+1))/(6*h(k+1));S(k+1,2)=m(k+1)/2;S(k+1,3)=d(k+1)-h(k+1)*(2*m(k+1)+m(k+2))/6;S(k+1,4)=y(k+1);end实验结果>> x=[0.52 3.1 8.0 17.95 28.65 39.62 50.65 78 104.6 156.6 208.6 260.7 321.5 364.4 416.3 468 494 507 520];>> y=[5.28794 9.4 13.84 20.2 24.9 28.44 31.1 35 36.5 36.6 34.6 31.00 26.34 20.9 14.8 7.8 3.7 1.5 0.2];>> vl=1.86548;>> vr=-0.046115;>> xx=[2 4 6 12 16 30 60 110 180 280 400 515];>> X=spline3(x,y,xx,vl,vr)X =Columns 1 through 47.8251 10.4813 12.3635 16.5756Columns 5 through 819.0916 25.3864 32.8042 36.6467Columns 9 through 1235.9432 29.7261 16.7109 0.54276.实验程序%运用列主元素消去法求解方程组并实现PA=LUfunction [x,L,U,P,IP]=lzylu(A,b) %定义函数[m,n]=size(A); %计算系数矩阵A的行列数if m~=nerror('系数矩阵不是方阵');return;endif det(A)==0 %计算矩阵A的行列式,若为零则A是奇异矩阵error('矩阵不能被三角形分解')endu=A;v=b;q=eye(m);s=q;%定义单位矩阵for j=1:m-1%按照列循环t=abs(u(j,j));mj=j;for i=j:mif abs(u(i,j))>tmj=i;endend%比较大小,选列主元素if u(mj,j)==0error('系数矩阵奇异');returnendB=u(j,:);c=v(j);u(j,:)=u(mj,:);v(j)=v(mj);u(mj,:)=B;v(mj)=c;%交换两行,将列主元素所在行移到第j行IP(j)=mj;%记录互换,表示第j行与第IP(j)行互换ts=s(j,:);s(j,:)=s(mj,:);s(mj,:)=ts;%置换矩阵进行相应行交换u(j+1:m,j)=u(j+1:m,j)/u(j,j);%求出L矩阵第j列第j+1到第m行元素u(j+1:m,j+1:m)=u(j+1:m,j+1:m)-u(j+1:m,j)*u(j,j+1:m);%解出u矩阵做完第j次消元后的矩阵v(j+1:m)=v(j+1:m)-v(j)*u(j+1:m,j);%v也要对应系数进行运算,相比杜利特尔(Doolittle)分解法减少了l*y=b,y=u*x 先要求解y再求x的过程endP=s;L=tril(u,-1)+q;%对u取下三角,其余部分全部为0,得到L矩阵U=triu(u);%对u取上三角,其余部分全部为0,得到U矩阵x(m)=v(m)/u(m,m);for i=m-1:-1:1sum=0;for k=i+1:msum=sum+U(i,k)*x(k);endx(i)=(v(i)-sum)/u(i,i);end%利用U*x=v,求解x得到行向量x=x';%转置为列向量function x=PLU(A,b,eps) %定义函数列主元三角分解法函数if (length(A)~=length(b)) %判断输入的方程组是否有误disp('输入方程有误!')return;enddisp('原方程为AX=b:') %显示方程组Abdisp('------------------------')n=length(A);A=[A b]; %将A与b合并,得到增广矩阵for r=1:nif r==1for i=1:n[c d]=max(abs(A(:,,1))); %选取最大列向量,并做行交换if c<=eps %最大值小于e,主元太小,程序结束break;elseendd=d+1-1;p=A(1,:);A(1,:)=A(d,:);A(d,:)=p;A(1,i)=A(1,i);endA(1,2:n)=A(1,2:n);A(2:n,1)=A(2:n,1)/A(1,1); %求u(1,i)elseu(r,r)=A(r,r)-A(r,1:r-1)*A(1:r-1,r); %按照方程求取u(r,i) if abs(u(r,r))<=eps %如果u(r,r)小于e,则交换行p=A(r,:);A(r,:)=A(r+1,:);A(r+1,:)=p;elseendfor i=r:nA(r,i)=A(r,i)-A(r,1:r-1)*A(1:r-1,i);%根据公式求解,并把结果存在矩阵A中endfor i=r+1:nA(i,r)=(A(i,r)-A(i,1:r-1)*A(1:r-1,r))/A(r,r);%根据公式求解,并把结果存在矩阵A中endendendy(1)=A(1,n+1);for i=2:nh=0;for k=1:i-1h=h+A(i,k)*y(k);endy(i)=A(i,n+1)-h; %根据公式求解y(i)endx(n)=y(n)/A(n,n);for i=n-1:-1:1h=0;for k=i+1:nh=h+A(i,k)*x(k);endx(i)=(y(i)-h)/A(i,i); %根据公式求解x(i)endAdisp('AX=b的解x是')x=x';%输出方程的解function [l,u,p]=PLU1(A) %定义子函数,其功能为列主元三角分解系数矩阵A [m,n]=size(A); %判断系数矩阵是否为方阵if m~=nerror('矩阵不是方阵')returnendif det(A)==0 %判断系数矩阵能否被三角分解error('矩阵不能被三角分解')endu=A;p=eye(m);l=eye(m); %将系数矩阵三角分解,分别求出P,L,Ufor i=1:mfor j=i:mt(j)=u(j,i);for k=1:i-1t(j)=t(j)-u(j,k)*u(k,i);endenda=i;b=abs(t(i));for j=i+1:mif b<abs(t(j))b=abs(t(j));a=j;endendif a~=ifor j=1:mc=u(i,j);u(i,j)=u(a,j);u(a,j)=c;endfor j=1:mc=p(i,j);p(i,j)=p(a,j);p(a,j)=c;endc=t(a);t(a)=t(i);t(i)=a;endu(i,i)=t(i);for j=i+1:mu(j,i)=t(j)/t(i);endfor j=i+1:mfor k=1:i-1u(i,j)=u(i,j)-u(i,k)*u(k,j);endendendl=tril(u,-1)+eye(m);u=triu(u,0)function x=PLU2(A,b) %定义列主元三角分解法的函数[l,u,p]=PLU1(A) %调用PLU分解系数矩阵Am=length(A); %由于A左乘p,故b也要左乘pv=b;for q=1:mb(q)=sum(p(q,1:m)*v(1:m,1));endb(1)=b(1) %求解方程Ly=bfor i=2:1:mb(i)=(b(i)-sum(1:i-1)*b(1:i-1));endb(m)=b(m)/u(m,m); %求解方程Ux=yfor i=m-1:-1:1b(i)=(b(i)-sum(u(i,i+1:m)*b(i+1:m)))/u(i,i);endclear x;disp('AX=b的解x是')x=b;测试结果:>> A=[1 1 1 1 1 1 1;2 1 1 1 1 1 1;3 2 1 1 1 1 1;4 3 2 1 1 1 1;5 4 3 2 1 1 1;6 5 4 3 2 1 1;7 6 5 4 3 2 1]; >> b=[7 8 10 13 17 22 28]';>> [x,L,U,P,IP]=lzylu(A,b)>> [x,L,U,P,IP]=lzylu(A,b)x =1.00001.00001.00001.00001.00001.00001.0000L =Columns 1 through 41.0000 0 0 00.2857 1.0000 0 00.4286 0.8000 1.0000 00.5714 0.6000 0.7500 1.00000.7143 0.4000 0.5000 0.66670.1429 -0.2000 -0.2500 -0.33330.8571 0.2000 0.2500 0.3333 Columns 5 through 70 0 00 0 00 0 00 0 01.0000 0 0-0.5000 1.0000 00.5000 -1.0000 1.0000U =Columns 1 through 47.0000 6.0000 5.0000 4.00000 -0.7143 -0.4286 -0.14290 0 -0.8000 -0.60000 0 0 -0.75000 0 0 00 0 0 00 0 0 0 Columns 5 through 73.0000 2.0000 1.00000.1429 0.4286 0.7143-0.4000 -0.2000 0.0000-0.5000 -0.2500 0.0000-0.6667 -0.3333 -0.00000 0.5000 1.00000 0 1.0000P =0 0 0 0 0 0 10 1 0 0 0 0 00 0 1 0 0 0 00 0 0 1 0 0 00 0 0 0 1 0 01 0 0 0 0 0 00 0 0 0 0 1 0IP =7 2 3 4 5 78.实验程序%欧拉法梯形格式function [x,y]=euler(u,v,a,b,h)%说明%对于下列类型的一阶方程组进行求解%y1'=u11*y1+u12*y2+…+u1m*ym;%y2'=u21*y1+u22*y2+…+u2m*ym;%…%ym'=um1*y1+um2*y2+…+umm*ym;%可写成矩阵乘积的形式,u=[u11,u12,…,u1m;u21,u22,…,u2m;……]; %初值向量v%y1(1)=v1,y2(1)=v2,…,ym(1)=vm;n=(b-a)/h;m=length(u);x=[a:h:b];y(:,1)=v;%定义y(:,1)代表方程组解矩阵的初值p=eye(m);A=-h/2*u+p;B=h/2*u+p;%由梯形法公式,推导出m元一阶方程组的解法for j=1:ny(:,j+1)=A\B*y(:,j);end%解矩阵y的第j列为x=a+(j-1)*h时的数值解x=x';%输出列向量y=y';%转置后,第i行第j列为x=a+(i-1)*h时yj的数值解x =0.10000.20000.30000.40000.50000.60000.70000.80000.90001.0000y =0 1.00000.2540 1.15870.6531 1.47171.29632.03702.34873.01874.0846 4.69096.96167.510211.7421 12.238319.6961 20.145232.9409 33.347255.0047 55.3723。
计算方法VB源代码[整理]
计算方法VB源代码Private Sub Command1_Click()Dim n As IntegerDim yi() As Single, xi() As Single, li() As SingleDim y0 As Single, x0 As Singlen=10x0=Val(InputBox("输入要求点的x值"))y0=0.0ReDim yi(n)ReDim xi(n)ReDim li(n)For i=1 To nYi(i)=Val(InputBox("输入第"&i&"个插值点的y值")) xi(i)=Val(InputBox("输入第"&i&"个插值点的x值"))Next iFor i=1 To nli(i)=1Next iFor i=1 To nFor j=1 To nIf i<>j Then li(i)=li(i)*(x0-xi(j))/(xi(i)-xi(j))Next jNext iFor i=1 To ny0=y0+li(i)*yi(i)Next iPrint "y0=";y0Rem 二分法Private Sub Command1_Click() Dim x1,x2,X,y1,y2,y,eer80 x1=InputBox("x1")x2=InputBox("x2")y1=f(x1)y2=f(x2)If y1*y2<0 ThenGoto 100ElsePrint("重新输入x1和x2") End If100 x=(x1+x2)/2y=f(x)If Abs(y)<=0.000001 ThenPrint("函数根为");xPrint("y=");yElseIf y1*y<0 Thenx2=xy2=yGoto 100Elsex1=xy1=yGoto 100End IfEnd IfPublic Function f(x)Dim yy=x^2-4*x-1f=yEnd FunctionREM 牛顿迭代法Private Sub Command1_Click()x0=1Do Until Abs(x^3-x-1)<=0.0001x=x0f=x^3-x-1g=3*x^2-1x0=x-f/gPrint("x0=");x0LoopEnd SubREM 高斯消除法求解方程组Private Sub Command1_Click()Dim i,j,m,n As IntegerDim a(),z(),x(),wn=InputBox("n")ReDim a(n+2,n+2),z(n+2,n+2),x(n+1) For i=1 To nFor j=1 To n+1a(i,j)=InputBox("a")Next jNext iFor i=1 To nw=a(i,i)For j=1 to n+1a(i,j)=a(i,j)/wNext jif i=n Then Goto 100For j=i+1 To nFor k=i+1 to n+1z(i,k)=a(i,k)*a(j,i)a(j,k)=a(j,k)-z(i,k)Next kNext jNext i100x(n+1)=0For k=n To 1 step-1s=0For j=k+1 To ns=s+a(k,j)*x(j)Next jx(k)=a(k,n+1)-sPrint"x";k;")=";x(k)Next kEnd SubREM Jacobi迭代源程序Private Sub Command1_Click() Dim n As IntegerDim a(),y(),g(),b(),X1(),X2()n=Input("方程维数");ReDim a(n+1,n+1),y(n+1)ReDim g(n+1),X1(n+1),X2(n+1),b(n+1,n+1) Dim s,eer,tk=0For i=1 To nX1(i)=1X2(i)=0Next iFor i=1 To nFor j=1 To nPrint"输入A()";i,ja(i,j)=InputBox(a(i,j))Next jy(i)=InputBox(y(i))Next iFor i=1 To ng(i)=y(i)/a(i,i)Next iFor i=1 To nFor j=1 To nIf i=j Thenb(i,j)=0Elseb(i,j)=-a(i,j)/a(i,i)End IfNext jNext i50 eer=0For i=1 To neer=eer+Abs(X1(i)-X2(i))Next iIf eer<0.0001 ThenGoto 100ElseFor i=1 To nX1(i)=X2(i)Next iEnd IfFor i=1 To ns=0For j=1 To ns=s+b(i,j)*X1(j)Next jX2(i)=s+g(i)Next ik=k+1Goto 50100For i=1 To nPrint X2(i)Next iPrint "k=";kEnd SubREM 高斯-塞迭尔 Gauss-Seidel Private Sub Command1_Click() Dim i As Integer,j As Integer Dim y(),t(),g(),X0(),X1(),k Dim s,b(),a(),errDim n As Integern=Input("请输入n=")ReDim y(n),t(n),a(n,n),X0(n),X1(n),b(n,n) For i=1 To nX0(i)=0X1(i)=X0(i)Next iFor i=1 To nFor j=1 To nPrint"输入A()";i,ja(i,j)=InputBox(a(i,j))Next jy(i)=InputBox(y(i))Next iFor i=1 To nt(i)=y(i)/a(i,i)Next iFor i=1 To nFor j=1 To nIf j=i Thenb(i,j)=0Elseb(i,j)=-a(i,j)/a(i,i)End IfNext jNext ik=0Dok=k+1For i=1 To ns=0For j=1 To ns=s+b(i,j)*X1(j)Next jX1(i)=s+t(i)Next ieer=0For i=1 To neer=eer+Abs(x1(i)-x0(i)) Next iFor i=1 To nX0(i)=X1(i)Next iLoop Until eer<=0.01For i=1 To nPrint X1(i)Next iPrint "k=";kEnd Sub。
计算方法实验代码
实验一拉格朗日插值法#include <stdio.h>void main(){static float Lx[10],Ly[10];int n,i,j;float x,y=0,p;printf("enter n=");//输入点的个数scanf("%d",&n);printf("enter xi\n");//输入点对应的x的值for(i=1;i<=n;i++)scanf("%f",&Lx[i]);printf("enter yi\n");//输入点对应的y的制for(i=1;i<=n;i++)scanf("%f",&Ly[i]);printf("enter x=");//输入验证的x的值scanf("%f",&x);for(i=1;i<=n;i++){p=1;for(j=1;j<=n;j++){if(i!=j)p=p*(x-Lx[j])/(Lx[i]-Lx[j]);}y=y+p*Ly[i];}printf("y=%f\n",y);//输入验证的x对应的y的值}实验二最小二乘法#include "stdio.h"float gs(float a[20][20],float b[20],int n ){int i,j,k,l;float s;k=1;while(k!=n+1){if(a[k][k]!=0){for(i=k+1;i<=n+1;i++){a[i][k]=a[i][k]/a[k][k];b[i]=b[i]-a[i][k]*b[k];for(j=k+1;j<=n+1;j++)a[i][j]=a[i][j]-a[i][k]*a[k][j];}}k=k+1;}for(k=n+1;k>=1;k--){s=0;for(l=k+1;l<=n+1;l++)s=s+a[k][l]*b[l];b[k]=(b[k]-s)/a[k][k];}return 0;}int main(){float a[20][20]={0.0};//定义a矩阵float c[20][20];//定义c矩阵float ct[20][20];//定义ct矩阵float x[20];//定义数组用于存放x的数据float y[20];//定义数组用于存放y的数据float b[20]={0.0};//定义b矩阵int i,j,k,m,n;printf("输入所求函数的最高次数n:\n");//输入n(求线性的函数输入1。
计算方法实验报告(附代码)
实验一 牛顿下山法实验说明:求非线性方程组的解是科学计算常遇到的问题,有很多实际背景.各种算法层出不穷,其中迭代是主流算法。
只有建立有效的迭代格式,迭代数列才可以收敛于所求的根。
因此设计算法之前,对于一般迭代进行收敛性的判断是至关重要的。
牛顿法也叫切线法,是迭代算法中典型方法,只要初值选取适当,在单根附近,牛顿法收敛速度很快,初值对于牛顿迭代 至关重要。
当初值选取不当可以采用牛顿下山算法进行纠正。
牛顿下山公式:)()(1k k k k x f x f x x '-=+λ下山因子 ,,,,322121211=λ下山条件|)(||)(|1k k x f x f <+实验代码:#include<iostream> #include<iomanip> #include<cmath>using namespace std;double newton_downhill(double x0,double x1); //牛顿下山法函数,返回下山成功后的修正初值double Y; //定义下山因子Y double k; //k为下山因子Y允许的最小值double dfun(double x){return 3*x*x-1;} //dfun()计算f(x)的导数值double fun1(double x){return x*x*x-x-1;} //fun1()计算f(x)的函数值double fun2(double x) {return x-fun1(x)/dfun(x);} //fun2()计算迭代值int N; //N记录迭代次数double e; //e表示要求的精度int main(){double x0,x1;cout<<"请输入初值x0:";cin>>x0;cout<<"请输入要求的精度:";cin>>e;N=1;if(dfun(x0)==0){cout<<"f'(x0)=0,无法进行牛顿迭代!"<<endl;}x1=fun2(x0);cout<<"x0"<<setw(18)<<"x1"<<setw(18)<<"e"<<setw(25)<<"f(x1)-f(x0)"<<endl;cout<<setiosflags(ios::fixed)<<setprecision(6)<<x0<<" "<<x1<<" "<<fabs(x1-x0)<<" "<<fabs(fun1(x1))-fabs(fun1(x0))<<endl;if(fabs(fun1(x1))>=fabs(fun1(x0))){ //初值不满足要求时,转入牛顿下山法x1=newton_downhill(x0,x1);} //牛顿下山法结束后,转入牛顿迭代法进行计算while(fabs(x1-x0)>=e){ //当精度不满足要求时N=N+1;x0=x1;if(dfun(x0)==0){cout<<"迭代途中f'(x0)=0,无法进行牛顿迭代!"<<endl;} x1=fun2(x0);cout<<setiosflags(ios::fixed)<<setprecision(6)<<x0<<" "<<x1<<" "<<fabs(x1-x0)<<endl;}cout<<"迭代值为:"<<setiosflags(ios::fixed)<<setprecision(6)<<x1<<'\n';cout<<"迭代次数为:"<<N<<endl;return 0;}double newton_downhill(double x0,double x1){Y=1;cout<<"转入牛顿下山法,请输入下山因子允许的最小值:";cin>>k;while(fabs(fun1(x1))>=fabs(fun1(x0))){if(Y>k){Y=Y/2;}else {cout<<"下山失败!";exit(0);}x1=x0-Y*fun1(x0)/dfun(x0);}//下山成功则cout<<"下山成功!Y="<<Y<<",转入牛顿迭代法计算!"<<endl;return x1;}实验结果:图4.1G-S 迭代算法流程图实验二 高斯-塞德尔迭代法实验说明:线性方程组大致分迭代法和直接法。
数值计算方法实验程序源代码
上机实验1. 秦九韶算法:编程求多项式P(x)=(((0.0625x+0.0425) x+1.912) x+2.1296在x=1.0处的值。
#include "stdio.h"main(){static float a[]={2.1296,1.912,0.0425,0.0625};float y;int i;float x=1.0;clrscr();y=a[3];for (i=2;i>=0;i--)y=y*x+a[i];printf("x=%4.2f,y=%6.4f",x,y);}2. 二分法:方程f(x)=x3-x-1=0,利用逐步搜索法确定一个有根区间。
#include "stdio.h"#include "math.h"#define f(x) (x*(x*x-1)-1)#define e 0.005main(){int i=0;float x,a=1,b=1.5,y=f(a);if(y*f(b)>=0){printf("\nThe range is error!"); return;}elsedo{ x=(a+b)/2;printf("\nx%d=%6.4f",i,x);i++;if (f(x)==0) break;if(y*f(x)<0)b=x;elsea=x;}while(fabs(b-a)>e);printf("\nx=%4.2f",x);} #include "stdio.h"#include "math.h"#define f(x) ((x*x-1)*x-1)main(){int i;float x,a=1,b=1.5,y=f(a);if(y*f(b)>=0){printf("\nThe range is error!"); return;}elsefor(i=0;i<=6;i++)/*次数限制结束*/ {x=(a+b)/2;printf("\nx%d=%6.4f",i,x);if (f(x)==0) break;if(y*f(x)<0)b=x;elsea=x;}printf("\nx=%4.2f",x);}3. 迭代法:(1) 求方程f(x)=x-10x+2=0的一个根#include "stdio.h"#include "math.h"main(){float x0,x1=1;int i=1;do{x0=x1;x1=log10(x0+2);printf("\nx%d=%6.4f",i,x1);i++;}while(fabs(x1-x0)>=0.00005);printf("\nx=%6.4f",x1);printf("\nf(x)=%6.4f",fabs(x1-pow(10,x1)+2)) ;} (2) 求方程x=e-x在0.5附近的根。
数值计算方法实验报告
数值计算方法实验报告一、实验目的本实验旨在通过Python语言编写数值计算方法程序,掌握常见数值计算方法的实现原理及应用。
具体包括:插值法、最小二乘法、数值微积分、数值解方程、数值解微分方程等。
二、实验环境Python编程语言、Jupyter Notebook环境三、实验内容1.插值法(1)代码实现:在Python中使用Scipy库中的Interpolate模块实现拉格朗日插值法和牛顿插值法,并通过数据可视化展示其效果。
(2)实验步骤:- 导入所需库,准备所需数据;- 定义拉格朗日插值法函数;- 定义牛顿插值法函数;- 测试函数并可视化结果。
(3)实验结果:2.最小二乘法(1)代码实现:在Python中使用Numpy库实现最小二乘法,并通过数据可视化展示其效果。
(2)实验步骤:- 导入所需库,准备所需数据;- 定义最小二乘法函数;- 测试函数并可视化结果。
(3)实验结果:3.数值微积分(1)代码实现:在Python中实现梯形法和辛普森法,并通过数据可视化展示其效果。
(2)实验步骤:- 导入所需库,准备所需数据;- 定义梯形法函数和辛普森法函数;- 测试函数并可视化结果。
(3)实验结果:4.数值解方程(1)代码实现:在Python中实现二分法、牛顿法和割线法,并通过数据可视化展示其效果。
(2)实验步骤:- 导入所需库,准备所需数据;- 定义二分法函数、牛顿法函数和割线法函数;- 测试函数并可视化结果。
(3)实验结果:5.数值解微分方程(1)代码实现:在Python中实现欧拉法和龙格-库塔法,并通过数据可视化展示其效果。
(2)实验步骤:- 导入所需库,准备所需数据;- 定义欧拉法函数和龙格-库塔法函数;- 测试函数并可视化结果。
(3)实验结果:四、实验总结通过本次实验,我学习了数值计算方法的常用算法和实现原理,掌握了Python 语言实现数值计算方法的方法,加深了对数值计算方法的理解和应用。
实验中遇到的问题,我通过查找资料和与同学的讨论得到了解决,也更加熟练地掌握了Python语言的使用。
python简易计算机代码
python简易计算机代码Python简易计算机代码Python是一种高级编程语言,它可以用来编写各种类型的程序,包括计算机程序。
在本文中,我们将介绍如何使用Python编写一个简易计算机代码。
我们需要定义一些变量来存储我们的计算结果。
我们可以使用Python的变量来存储数字、字符串和其他类型的数据。
例如,我们可以定义一个变量x来存储我们的第一个数字,定义一个变量y来存储我们的第二个数字,定义一个变量result来存储我们的计算结果。
接下来,我们需要编写一些函数来执行不同的计算操作。
例如,我们可以编写一个函数add来执行加法操作,一个函数subtract来执行减法操作,一个函数multiply来执行乘法操作,一个函数divide 来执行除法操作。
下面是一个简单的Python计算机代码示例:```# 定义变量x = 10y = 5result = 0# 定义函数def add(x, y):return x + ydef subtract(x, y):return x - ydef multiply(x, y):return x * ydef divide(x, y):return x / y# 执行计算result = add(x, y)print("x + y = ", result)result = subtract(x, y) print("x - y = ", result)result = multiply(x, y) print("x * y = ", result)result = divide(x, y) print("x / y = ", result)```在上面的代码中,我们首先定义了三个变量x、y和result,然后定义了四个函数add、subtract、multiply和divide来执行不同的计算操作。
计算方法VB源代码
计算方法VB源代码以下是一个计算器的VB源代码,用于进行基本的四则运算:```vbImports System.GlobalizationPublic Class CalculatorFormPrivate operand1 As DoublePrivate operand2 As DoublePrivate operation As StringPrivate Sub CalculateButton_Click(sender As Object, e As EventArgs) Handles CalculateButton.ClickIf Double.TryParse(Operand1TextBox.Text, operand1) AndAlso Double.TryParse(Operand2TextBox.Text, operand2) Then Select Case operationCase "+"ResultTextBox.Text = (operand1 +operand2).ToString(CultureInfo.InvariantCulture)Case "-"ResultTextBox.Text = (operand1 -operand2).ToString(CultureInfo.InvariantCulture)Case "*"ResultTextBox.Text = (operand1 *operand2).ToString(CultureInfo.InvariantCulture)Case "/"If operand2 <> 0 ThenResultTextBox.Text = (operand1 /operand2).ToString(CultureInfo.InvariantCulture)ElseMessageBox.Show("Division by zero is not allowed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)End IfCase ElseMessageBox.Show("Invalid operation.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)End SelectElseMessageBox.Show("Invalid operands.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)End IfEnd SubPrivate Sub OperationButton_Click(sender As Object, e As EventArgs) Handles AdditionButton.Click, SubtractionButton.Click, MultiplicationButton.Click, DivisionButton.ClickDim button As Button = CType(sender, Button)operation = button.TextEnd SubEnd Class```这是一个简单的计算器窗体应用程序,由两个文本框(Operand1TextBox 和 Operand2TextBox) 用于输入操作数,一个结果文本框 (ResultTextBox) 用于显示结果,以及四个按钮 (AdditionButton、SubtractionButton、MultiplicationButton 和 DivisionButton) 用于选择四则运算操作。
python计算代码
python计算代码Python是一种简单且易学的高级编程语言,广泛应用于数据分析、机器学习、网站开发等领域。
它具有更简洁的语法、强大的标准库以及丰富的第三方库,使得编写计算代码变得更加便捷和高效。
在Python中,我们可以通过各种内置的数学函数和运算符来进行数值计算。
下面是一些常用的计算代码示例:1. 四则运算:```pythona = 10b = 5c = a + b # 加法d = a - b # 减法e = a * b # 乘法f = a / b # 除法```这段代码演示了Python中的四则运算,分别计算了两个整数的加、减、乘、除运算,并分别将结果赋值给不同的变量。
2. 求幂运算:```pythona = 2b = 3c = a ** b # 求幂运算```这段代码演示了Python中的求幂运算,它将2的3次方计算并赋值给变量c。
3. 求绝对值:```pythona = -5b = abs(a) # 求绝对值```这段代码演示了Python中的绝对值计算,它将变量a的绝对值计算并赋值给变量b。
4. 求平方根:```pythonimport matha = 9b = math.sqrt(a) # 求平方根```这段代码演示了Python中使用math模块的sqrt函数来求平方根。
5. 求三角函数:```pythonimport mathangle = math.pi / 4 # 弧度制表示角度sin_val = math.sin(angle) # 正弦函数cos_val = math.cos(angle) # 余弦函数tan_val = math.tan(angle) # 正切函数arcsin_val = math.asin(sin_val) # 反正弦函数arccos_val = math.acos(cos_val) # 反余弦函数arctan_val = math.atan(tan_val) # 反正切函数```这段代码演示了Python中使用math模块的三角函数,以及反三角函数来计算角度的正弦、余弦、正切以及它们的反函数。
汇编语言实验算术运算编程
汇编语言实验算术运算编程实验二算术运算编程实践(报告)**计本学号:通过直观算术运算编程课堂教学,熟识汇编语言源程序的基本结构及汇编程序设计的基本步骤,初步掌控汇编程序设计的基本方法。
熟识调试程序debug的常用命令。
硬件环境:ibm/pc及其兼容机软件环境:操作系统dos2.0版本以上(目前已是dos6.0以上);在硬盘中存在edit或qe、masm、link软件。
1.先行按以下取值的公式编写程序:(3*x1-(x2*x3+7*x4-200))/x3其中,x1,x2,x3,x4为16十一位带符号数的字变量。
计算结果的商存有ax中,余数存放在dx中。
2.调用调试程序debug对该程序进行调试。
四.编程与调试datasegmentx1dw1hx2dw1hx3dw1hx4dw1hdataendsstack1segmentparastackdw20hdup(0)stack1endscodesegmentassumecs:code,ds:data,ss:stack1movax,datamovds,axmovax,x1movcl,2shlx1,clsubx1,axmovax,x2imulx3movbx,x4movcl,3shlx4,clsubx4,bx subx4,200h;200hmovbx,dxmovcx,axmovax,x4cwdaddax,cxadcdx,bxmovbx,dxmovcx,axmovax,x1cwdsubax,cxsbbdx,bxidivx3movah,4chint21hcodeendsendstart 七.实验记录:实验正常。
计算器C++实验报告附源代码
四川大学软件学院实验报告学号:1043111051 姓名:王金科专业:软件工程班级:2010级5班课程名称数据结构实验课时8实验项目计算器实验时间8到10周实验目的了解c++类的封装和KMP算法。
Windows平台 VC6.0++实验环境实验内容(算法、程序、步骤和方法)部分函数创建思想创建过程如下:实验流程图程序清单文件名:main.cpp#include<iostream>using namespace std ;#include<stdio.h>#include<malloc.h>#include"DefNit.h"#include"Compare.h"#include<windows.h>int main(){LinkOptr T;LinkOpnd N;InitStack(&T);PushOptr(T,'#');InitStack(&N);char ch ,key;int i=0,j=0,num2=0,op1,op2;while(1){system("cls") ;cout<<"\n\n\t\t\t********* 计算器*********”;cout<<"\n\n\t\t):请输入算数表达式(数入#号结束输入)";ch=getchar();while(ch!='#'||GetTop1(T)!='#'){if(!IsOptr(ch)){i++;if(i<=j)num2=(int(ch)-48);if(i>j){num2=num2*10+(int(ch)-48);i=j=0;}if(!IsOptr(ch=getchar()))i++;if(i==j)PushOpnd(N,num2);//用getchar()函数读进来的字符肯定只能是一个字符,比如,12是先读‘1’,然后读‘2’,这里的i和j是用来判断个位数还是十位数的,num2是把运算数栈前零散的字符统计出来}elseswitch(Precede(GetTop1(T),ch)){case '<':PushOptr(T,ch);if(ch!='('&&ch!=')')j++;ch=getchar();break;case '=':PopOptr(T);ch=getchar();break;case '>':op1=PopOpnd(N);op2=PopOpnd(N);PushOpnd(N,Operate(op2,PopOptr(T),op1));break;}}cout<<"\n\n\t\t表达式的最终结果为:";printf("%5d\n",GetTop2(N)) ;cout<<"\n\n\t\t是否继续(Y/N)" ;cin>>key ;if(key=='n'||key=='N'){break;}}cout<<"\n\n\t\t";return 0;}文件名:Compare.hint IsOptr(char ch){char ptr[10]={'+','-','*','/','(',')','#'};for(int i=0;i<7;i++){if(ch==ptr[i])return true;}return false;}char Precede(char ch1,char ch2){if((ch1=='+'||ch1=='-'||ch1=='*'||ch1=='/'||ch1==')')&&(ch2=='+'||ch2==' -'||ch2==')'||ch2=='#'))return '>';elseif((ch1=='('||ch1=='#')&&(ch2=='+'||ch2=='-'||ch2=='*'||ch2=='/'||ch2==' ('))return '<';else if((ch1=='+'||ch1=='-'||ch1=='*'||ch1=='/')&&ch2=='(') return '<';else if((ch1=='+'||ch1=='-')&&(ch2=='*'||ch2=='/'))return '<';else if((ch1=='*'||ch1=='/'||ch1==')')&&(ch2=='*'||ch2=='/')) return '>';else if(ch1=='('&&ch2==')')return '=';else if(ch1=='#'&&ch2=='#')return '=';elsereturn false;}int Operate(int x,char ch,int y){if(ch=='+')return x+y;else if(ch=='-')return x-y;else if(ch=='*')return x*y;else if(ch=='/')return x/y;elsereturn false;}文件名:DefNit.htypedef struct Node1{char ch;struct Node1 *Next;}Optr,*LinkOptr; //运算符栈typedef struct Node{int num;struct Node *Next;}Opnd,*LinkOpnd; //运算数栈void InitStack(LinkOptr *S){(*S)=(LinkOptr)malloc(sizeof(Optr));(*S)->Next=NULL;}void InitStack(LinkOpnd *S){(*S)=(LinkOpnd)malloc(sizeof(Opnd));(*S)->Next=NULL;}int PushOptr(LinkOptr pr,char ch1){LinkOptr temp;temp=(LinkOptr)malloc(sizeof(Optr)); temp->ch=ch1;temp->Next=pr->Next;pr->Next=temp;return true;}int PushOpnd(LinkOpnd pn,int num1){LinkOpnd temp;temp=(LinkOpnd)malloc(sizeof(Opnd)); temp->num=num1;temp->Next=pn->Next;pn->Next=temp;return true;}char PopOptr(LinkOptr S) {if(S->Next==NULL)return true;LinkOptr temp;temp=S->Next;S->Next=temp->Next; return temp->ch;free(temp);}int PopOpnd(LinkOpnd S) {if(S->Next==NULL)return true;LinkOpnd temp;temp=S->Next;S->Next=temp->Next; return temp->num;free(temp);}char GetTop1(LinkOptr S) {return S->Next->ch; }int GetTop2(LinkOpnd S) {return S->Next->num; }实验内容(算法、程序、步骤和方法)数据记录和计算结论(结果)这个程序达到了实验的要求,可以实现运算表达式的输入、运算和输出,而且可以进行输入验错,可以正常运行。
计算方法实验+编程代码
计算方法实验报告1 在区间[-1,1]上分别取n=10,20,用两组等距节点对龙格函数21()125f x x=+作多项式插值,对每个n 值,分别画出插值函数及()f x 的图形。
解:n=10时:n=20时:2 在区间[-1,1]上分别取n=10,20,用两组等距节点对龙格函数21()125f x x=+作分段线性插值,对每个n 值,分别画出插值函数及()f x 的图形。
解:n=10:n=20时:3 对龙格函数21()125f x x =+在区间[-1,1]上取21, 0,1,2k x k k n n=-+= ,n 分别取10,20,试分别求3次、5次最小二乘拟合多项式,打印出此曲线拟合函数,分别画出此拟合函数及()f x 的图形。
3次最小二乘拟合n=10时:n=20时:5次最小二乘拟合n=10时:n=20时:4 取点21cos,0,1,22(1)kkx k nnπ+==+,n分别取10,20,对龙格函数21()125f xx=+作多项式插值,对每个n值,分别画出插值函数及()f x的图形。
解:n=10时:n=20时:5 比较上面三组近似函数,说说你的体会。
你能在此基础上做进一步的探索吗,比如n如果继续增加下去,结果会如何?附注:编程语言不限,但用matlab等语言编程时,不得直接调用现成的插值与逼近函数,需要你在我们课堂教学的基础上,编程实现上述算法。
解:用不同方法进行插值,得出的插值函数差异较大。
其中,最小二乘拟合的曲线精度较低,多项式插值拟合的曲线精度较高。
曲线拟合的精度不仅和拟合方法有关,还和采样点位置的选取、个数有关。
如1,4题都是多项式插值,但是第4题的拟合度最高。
n值越大,拟合的函数会更加接近原函数。
程序:1.等距节点多项式插值clear;clc;syms xn=input('input n=');x1=linspace(-1,1,n+1);y1=1./(1.+25*x1.^2);yy=zeros(1,n+1);fx=0;for i=1:n+1;lga=1;for j=1:n+1if j~=ilga=lga*(x-x1(1,j))/(x1(1,i)-x1(1,j));elseendendfx=fx+y1(1,i)*lga;enddisp(fx);x=-1:0.01:1;plot(x,eval(fx),'rh')hold ona=linspace(-1,1,100);y2=1./(1.+25*a.^2);plot(a,y2,'b')legend('插值函数','龙格函数')2.分段线性插值function y=div(x0,y0,x,n)for j=1:nif (x>=x0(j))&&(x<=x0(j+1))y=(x-x0(j+1))/(x0(j)-x0(j+1))*y0(j)+(x-x0(j))/(x0(j+1)-x0(j ))*y0(j+1);elsecontinueendendendclear;clc;n=input('input n=');x0=linspace(-1,1,n+1);yy=zeros(2001,1);for i=1:1:2001xx(i,1)=0.001*(i-1)-1;y=div(x0,1./(1+25*x0.^2), xx(i,1),n);disp(y);yy(i,1)=y;endplot(xx,yy,'r','LineWidth',1.5)a=linspace(-1,1,100);hold onplot(a,1./(1+25*a.^2),'b','LineWidth',1.5)legend('插值函数','龙格函数')3.①三次最小二乘拟合clear ;n=input('input n=');x0=ones(n+1,1);x1=zeros(n+1,1);x2=zeros(n+1,1);x3=zeros(n+1,1);y1=zeros(n+1,1);for k=0:1:nx1(1+k,1)=-1+2*k/n;y1(1+k,1)=1./(1+25*x1(1+k,1).^2);x2(k+1,1)=x1(k+1,1)*x1(k+1,1);x3(k+1,1)=x1(k+1,1)*x1(k+1,1)*x1(k+1,1); endA=[x0 x1 x2 x3];B=A'*A;C=A'*(y1);D=B\C;x=linspace(-1,1,51);y=D(4,1)*x.^3+D(3,1)*x.^2+D(2,1)*x+D(1,1);a=linspace(-1,1,101);y0=1./(1+25*a.^2);plot(x,y,'rh')hold onplot(a,y0,'b','LineWidth',2)legend('插值函数','龙格函数')②五次最小二乘拟合clear ;n=input('input n=');x0=ones(n+1,1);x1=zeros(n+1,1);x2=zeros(n+1,1);x3=zeros(n+1,1);x4=zeros(n+1,1);x5=zeros(n+1,1);y1=zeros(n+1,1);for k=0:1:nx1(1+k,1)=-1+2*k/n;y1(1+k,1)=1./(1+25*x1(1+k,1).^2);x2(k+1,1)=x1(k+1,1)*x1(k+1,1);x3(k+1,1)=x1(k+1,1)*x1(k+1,1)*x1(k+1,1); x4(k+1,1)=(x1(k+1,1)).^4;x5(k+1,1)=(x1(k+1,1)).^5;endA=[x0 x1 x2 x3 x4 x5];B=A'*A;C=A'*(y1);D=B\C;x=linspace(-1,1,51);y=D(6,1)*x.^5+D(5,1)*x.^4+D(4,1)*x.^3+D(3,1)*x.^2+D(2,1)*x+ D(1,1);a=linspace(-1,1,101);y0=1./(1+25*a.^2);plot(x,y,'rh')hold onplot(a,y0,'b','LineWidth',2)legend('插值函数','龙格函数')4.多项式插值clear;clc;syms xn=input('input n=');x1=zeros(1,n+1);y1=zeros(n+1);for k=0:1:nx1(1,k+1)=cos((2*k+1)*pi/(2*(n+1)));y1(1,k+1)=1./(1.+25*x1(1,k+1).^2);endyy=zeros(1,n+1);fx=0;for i=1:n+1;lga=1;for j=1:n+1if j~=ilga=lga*(x-x1(1,j))/(x1(1,i)-x1(1,j));elseendendfx=fx+y1(1,i)*lga;enddisp(fx);x=-1:0.01:1;plot(x,eval(fx),'rh')hold ona=linspace(-1,1,100);y2=1./(1.+25*a.^2);plot(a,y2,'b','LineWidth',1.5) legend('插值函数','龙格函数')。
数值计算课程设计程序代码
这是本人做的数值计算课程设计的程序源代码。
代码均为C++语言编写。
前面十个程序代码分别为十种数值算法,最后一个程序代码头文件“”的源代码。
这十个程序有大部分要用到头文件“”,具体请查看程序的头文件包含申明语句。
这个头文件中包含矩阵常用运算的函数,可像matlab中一样方便的使用矩阵。
1.二分法解非线性方程#include<iostream>#include<cmath>using namespace std;//二分法解非线性方程double F(double x) //待解的f(x){ return x*sin(x)-1;}int main(){double a,b,ya,yb,delta,t,yt,err;cout<<"请依次输入区间(a,b)的左右端点值及精度要求delta : ";cin>>a>>b>>delta;int i,max1;ya=F(a); yb=F(b);if(ya*yb>0)return 0;max1=1+int(log(b-a)-log(delta)/log(2));for(i=1;i<=max1;i++){t=(a+b)/2;yt=F(t);if(yt==0){a=t;b=t;}else if(yb*yt>0){b=t;yb=yt;}else{a=t;ya=yt;}if(b-a<delta)break;}t=(a+b)/2;err=fabs(a-b);cout<<"方程的解为:"<<t<<endl;cout<<"误差: err = "<<err<<endl;return 0;}2.高斯列主元消去法解线性方程组#include<iostream>#include"matrix.h"using namespace std;//高斯列主元消去法解线性方程组int main(){matrix A,X; //A用来保存线性方程组的增广矩阵,X保存方程组的解int i,j,k,l,n;double temp;cout<<"请输入线性方程组的维数: n = "; cin>>n;A(n,n+1); cout<<"请输入线性方程组的增广矩阵:\n A = "<<endl;A.input();for(i=1;i<=n;i++) //行变换为上三角形{temp=A(i,i); k=0;for(j=i+1;j<=n;j++) //选列主元{if(fabs(A(j,i))>fabs(temp)){temp=A(j,i);k=j;}}if(k>i)A.M_h(i,k); //选主元后行交换for(j=i+1;j<=n;j++){temp=-A(j,i)/A(i,i);A.M_h(temp,i,j);}}//cout<<"测试:A=\n";A.print(8);for(i=n;i>=1;i--) //回代求解{temp=0;for(j=1;j<=n-i;j++)temp+=A(i,i+j)*X(i+j);X(i)=(A(i,n+1)-temp)/A(i,i);}cout<<"线性方程组的解为(从x1到xn顺序排列): \nX = "<<endl;X.print(8);return 0;}3.龙贝格积分算法#include<iostream>#include"matrix.h"using namespace std;//龙贝格积分算法double F(double x)//被积函数{return (x*x+x+1)*cos(x);}double power(double a,int n) //a的n次方{double temp=1;for(int i=0;i<n;i++)temp*=a;return temp;}int main(){matrix R; //R为龙贝格积分表double a,b,tol,err=1,x,h,s;int i,n,m=1,j,k;cout<<"请依次输入下限a,上限b,精度tol,积分表行数n: ";cin>>a>>b>>tol>>n;h=b-a;R=E(n);R(1,1)=(F(a)+F(b))*h/2;for(i=1;i<n&&err>tol;i++){h=h/2;s=0;for(j=1;j<=m;j++){x=a+h*(2*j-1);s+=F(x);}R(i+1,1)=R(i,1)/2+h*s;m=2*m;for(k=1;k<=i;k++){R(i+1,k+1)=R(i+1,k)+(R(i+1,k)-R(i,k))/(power(4,k)-1);}err=fabs(R(i,i)-R(i+1,k)); //注意:结束循环时,k=i+1。
java实验算术测试代码
java实验算术测试代码我们需要了解什么是算术测试。
算术测试是指对数学运算的正确性进行验证的过程。
常见的算术运算包括加法、减法、乘法和除法。
在编程中,我们可以通过编写代码来实现这些运算,并进行测试以验证其正确性。
在Java中,我们可以使用基本的数学运算符来进行算术运算。
例如,加法运算可以使用"+"符号,减法运算可以使用"-"符号,乘法运算可以使用"*"符号,除法运算可以使用"/"符号。
下面是一个简单的Java代码示例,用于进行加法运算:```javapublic class ArithmeticTest {public static void main(String[] args) {int a = 10;int b = 5;int result = a + b;System.out.println("两数之和为:" + result);}}```上述代码中,我们定义了两个整数变量a和b,并分别赋值为10和5。
然后我们使用加法运算符"+"将这两个数相加,并将结果赋值给变量result。
最后,我们使用System.out.println()方法将结果输出到控制台。
除了加法运算,我们还可以使用其他运算符进行减法、乘法和除法运算。
下面是一个完整的Java代码示例,用于进行四则运算的测试:```javapublic class ArithmeticTest {public static void main(String[] args) {int a = 10;int b = 5;// 加法运算int sum = a + b;System.out.println("两数之和为:" + sum);// 减法运算int difference = a - b;System.out.println("两数之差为:" + difference);// 乘法运算int product = a * b;System.out.println("两数之积为:" + product);// 除法运算int quotient = a / b;System.out.println("两数之商为:" + quotient);}}```上述代码中,我们首先定义了两个整数变量a和b,并分别赋值为10和5。
C语言算法代码范文
C语言算法代码范文以下是一个使用C语言编写的算法示例代码,用于计算给定数字的平方根。
```c#include <stdio.h>#include <math.h>float squareRoot(float n)float x = n;float y = 1;while (x - y > precision)x=(x+y)/2;y=n/x;}return x;int maifloat num;printf("Enter a number: ");scanf("%f", &num);if (num < 0)printf("Invalid input! Cannot calculate square root of a negative number.\n");} elsefloat result = squareRoot(num);printf("Square root of %.2f = %.6f\n", num, result);}return 0;```这个程序使用了牛顿迭代法来计算给定数字的平方根。
主要步骤如下:1. 首先定义了一个用于计算平方根的函数`squareRoot`。
该函数接受一个浮点数作为参数,并返回其平方根的近似值。
2. 在`squareRoot`函数中,初始化两个变量`x`和`y`,分别表示迭代的初始值。
`x`初始化为输入的数字`n`,`y`初始化为13. 定义一个变量`precision`表示迭代的精度,即当`x - y`的差值小于精度时停止迭代。
4. 使用一个`while`循环,当`x - y`大于精度时继续迭代。
在每一次迭代中,更新`x`和`y`的值,分别计算它们的平均值和`n/x`的值。
5.循环结束后,返回最后的近似值`x`。
6. 在`main`函数中,首先要求用户输入一个数字,并将其存储在`num`变量中。
实验5算术运算程序设计参考程序
实验5 算术运算程序设计一、实验内容: 1. 再次单步运行8位、16位2进制数加法,分析其对标志位的影响,2. 了解PUSHF、POP AX二条指令的意义3. 分析加法、乘法程序的构成与意义4. 设计二字加法运算程序5.设计加法运算结果以16进制显示程序设计方法二、实验目的:1.复习用DEBUG调试目的程序的方法。
2.用DEBUG分析运算结果。
3.学习双精度数加法程序设计方法。
4.复习以16进制格式显示二进制数的程序设计方法5.学习利用多个程序段组合设计程序的方法三、实验题目1. 单步运行以下8位2进制数加法:88H+0CH;0CEH+0C4H;0CEH+84H与16位2进制数加法:9588H+720CH;9588H+0B284H运算程序,对每次运算分析其对标志位的影响。
记录实验结果,并与分析结果比较。
DATA SEGMENTA DW 000AHC DW 'AB','CD','EF','GH','IJ','KL'DATA ENDSSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV AH,10001000BMOV AL,00001100BADD AH,ALPUSHFPOP AXMOV AH,11001110BMOV AL,11000100BADD AH,ALPUSHFPOP AXMOV AH,11001110BMOV AL,10000100BADD AH,ALPUSHFPOP AXMOV AX,1001010110001000BMOV DX,0111001000001100BADD AX,DXPUSHFPOP AXMOV AX,1001010110001000BMOV DX,1011001010000100BADD AX,DXPUSHFPOP AXMOV AH,4CHINT 21HCODE ENDSEND START2.分析以下程序功能是什么?分析其每一次算术运算对标志位的影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法实验报告
1 在区间[-1,1]上分别取n=10,20,用两组等距节点对龙格函数21()125f x x
=+作多项式插值,对每个n 值,分别画出插值函数及()f x 的图形。
解:n=10时:
n=20时:
2 在区间[-1,1]上分别取n=10,20,用两组等距节点对龙格函数21()125f x x
=
+作分段线性插值,对每个n 值,分别画出插值函数及()f x 的图形。
解:n=10:
n=20时:
3 对龙格函数21()125f x x =
+在区间[-1,1]上取21, 0,1,2k x k k n n
=-+= ,n 分别取10,20,试分别求3次、5次最小二乘拟合多项式,打印出此曲线拟合函数,分别画出此拟合函数及()f x 的图形。
3次最小二乘拟合
n=10时:
n=20时:
5次最小二乘拟合n=10时:
n=20时:
4 取点
21
cos,0,1,2
2(1)
k
k
x k n
n
π
+
==
+
,n分别取10,20,对龙格函数
2
1
()
125
f x
x
=
+
作多项式插值,对每个n值,分别画出插值函数及()
f x的图形。
解:n=10时:
n=20时:
5 比较上面三组近似函数,说说你的体会。
你能在此基础上做进一步的探索吗,比如n如果继续增加下去,结果会如何?
附注:编程语言不限,但用matlab等语言编程时,不得直接调用现成的插值与逼近函数,需要你在我们课堂教学的基础上,编程实现上述算法。
解:用不同方法进行插值,得出的插值函数差异较大。
其中,最小二乘拟合的曲线精度较低,多项式插值拟合的曲线精度较高。
曲线拟合的精度不仅和拟合方法有关,还和采样点位置的选取、个数有关。
如1,4题都是多项式插值,但是第4题的拟合度最高。
n值越大,拟合的函数会更加接近原函数。
程序:
1.等距节点多项式插值
clear;
clc;
syms x
n=input('input n=');
x1=linspace(-1,1,n+1);
y1=1./(1.+25*x1.^2);
yy=zeros(1,n+1);
fx=0;
for i=1:n+1;
lga=1;
for j=1:n+1
if j~=i
lga=lga*(x-x1(1,j))/(x1(1,i)-x1(1,j));
else
end
end
fx=fx+y1(1,i)*lga;
end
disp(fx);
x=-1:0.01:1;
plot(x,eval(fx),'rh')
hold on
a=linspace(-1,1,100);
y2=1./(1.+25*a.^2);
plot(a,y2,'b')
legend('插值函数','龙格函数')
2.分段线性插值
function y=div(x0,y0,x,n)
for j=1:n
if (x>=x0(j))&&(x<=x0(j+1))
y=(x-x0(j+1))/(x0(j)-x0(j+1))*y0(j)+(x-x0(j))/(x0(j+1)-x0(j ))*y0(j+1);
else
continue
end
end
end
clear;
clc;
n=input('input n=');
x0=linspace(-1,1,n+1);
yy=zeros(2001,1);
for i=1:1:2001
xx(i,1)=0.001*(i-1)-1;
y=div(x0,1./(1+25*x0.^2), xx(i,1),n);
disp(y);
yy(i,1)=y;
end
plot(xx,yy,'r','LineWidth',1.5)
a=linspace(-1,1,100);
hold on
plot(a,1./(1+25*a.^2),'b','LineWidth',1.5)
legend('插值函数','龙格函数')
3.
①三次最小二乘拟合
clear ;
n=input('input n=');
x0=ones(n+1,1);
x1=zeros(n+1,1);
x2=zeros(n+1,1);
x3=zeros(n+1,1);
y1=zeros(n+1,1);
for k=0:1:n
x1(1+k,1)=-1+2*k/n;
y1(1+k,1)=1./(1+25*x1(1+k,1).^2);
x2(k+1,1)=x1(k+1,1)*x1(k+1,1);
x3(k+1,1)=x1(k+1,1)*x1(k+1,1)*x1(k+1,1); end
A=[x0 x1 x2 x3];
B=A'*A;
C=A'*(y1);
D=B\C;
x=linspace(-1,1,51);
y=D(4,1)*x.^3+D(3,1)*x.^2+D(2,1)*x+D(1,1);
a=linspace(-1,1,101);
y0=1./(1+25*a.^2);
plot(x,y,'rh')
hold on
plot(a,y0,'b','LineWidth',2)
legend('插值函数','龙格函数')
②五次最小二乘拟合
clear ;
n=input('input n=');
x0=ones(n+1,1);
x1=zeros(n+1,1);
x2=zeros(n+1,1);
x3=zeros(n+1,1);
x4=zeros(n+1,1);
x5=zeros(n+1,1);
y1=zeros(n+1,1);
for k=0:1:n
x1(1+k,1)=-1+2*k/n;
y1(1+k,1)=1./(1+25*x1(1+k,1).^2);
x2(k+1,1)=x1(k+1,1)*x1(k+1,1);
x3(k+1,1)=x1(k+1,1)*x1(k+1,1)*x1(k+1,1); x4(k+1,1)=(x1(k+1,1)).^4;
x5(k+1,1)=(x1(k+1,1)).^5;
end
A=[x0 x1 x2 x3 x4 x5];
B=A'*A;
C=A'*(y1);
D=B\C;
x=linspace(-1,1,51);
y=D(6,1)*x.^5+D(5,1)*x.^4+D(4,1)*x.^3+D(3,1)*x.^2+D(2,1)*x+ D(1,1);
a=linspace(-1,1,101);
y0=1./(1+25*a.^2);
plot(x,y,'rh')
hold on
plot(a,y0,'b','LineWidth',2)
legend('插值函数','龙格函数')
4.多项式插值
clear;
clc;
syms x
n=input('input n=');
x1=zeros(1,n+1);
y1=zeros(n+1);
for k=0:1:n
x1(1,k+1)=cos((2*k+1)*pi/(2*(n+1)));
y1(1,k+1)=1./(1.+25*x1(1,k+1).^2);
end
yy=zeros(1,n+1);
fx=0;
for i=1:n+1;
lga=1;
for j=1:n+1
if j~=i
lga=lga*(x-x1(1,j))/(x1(1,i)-x1(1,j));
else
end
end
fx=fx+y1(1,i)*lga;
end
disp(fx);
x=-1:0.01:1;
plot(x,eval(fx),'rh')
hold on
a=linspace(-1,1,100);
y2=1./(1.+25*a.^2);
plot(a,y2,'b','LineWidth',1.5) legend('插值函数','龙格函数')。