计算方法 程序

合集下载

产品成本计算的程序与基本方法

产品成本计算的程序与基本方法

辅助生产费用分配表:(直接分配法)
辅助生产车间名称 待分配费用 供应辅助生产车间以外单位的劳务数 量 费用分配率(单位成本) 供水车间 20650 41300-100000 0.066 供电车间 47400 230000-3000 0.237 合计
基本生产 丙产品
基本生产车 间一般耗用 行政管理 部门耗用
应借“基本 生产成本” 科目
应借“制造 费用”科目 应借“管理 费用”科目
用量
金额 用量 金额 用量 金额 20500 13530 80000 5280
103000
24411 80000 18960 12000 2844 8124 32490 24411
专设销售 机构耗用
应借“销售 费用”科目
用量
金额
4.生产费用在完工产品与期末在产品之间进行 分配
5.结转验收入库完工产品的成本
二、产品成本计算的基本方法
产品 品种
品种法
按成本计算对象
产品 批别
基本方法
产品生 产步骤
分批法 分步法
三、制造费用的归集与分配 制造费用
为生产产品而 发生的各项间 接费用 月末按一定的标准和 方法转入各成本计算 对象的数额
供风
有时也可 对外销售
运输
辅助生产费用 的归集和分配
通过“辅助生产成 本” 科目进行核算
该科目和“基本生产成本”科目一样, 按车间以及产品或劳务的种类设置明细账, 账中按照成本项目设置专栏,进行明细核算。
辅助生产费用的分配
直接分配法
顺序分配法
分 配 方 法
交互分配法 计划成本分配法 代数分配法
是将各辅助生产车间发生的费用直接分配给除 辅助生产车间以外的各受益产品、单位,不考虑 各辅助生产车间之间相互提供产品或劳务的情况。

计算方法(各种方法的程序源代码)

计算方法(各种方法的程序源代码)

第一章求根公式法:#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]);}。

数值分析计算方法程序汇总

数值分析计算方法程序汇总

(一)复化梯形公式例:求121?x dx -=⎰程序:#include "stdio.h"void main(){double a,b,s,h,x;int i,n;a=-1.0;b=1.0;n=10;h=(b-a)/n;x=a;s=x*x/2;for(i=1;i<n;i++){x=x+h;s=s+x*x;}s=s+b*b/2;s=s*h;printf("s=%f\n",s);}结果:s=0.680000(二)复化辛普森公式例:求130?x dx=⎰程序:#include "stdio.h"void main(){double a,b,c,s,h,x,y;int i,n;a=0.0;b=1.0;n=10;s=0.0;h=(b-a)/n;x=a;y=x+h;c=(x+y)/2;for(i=1;i<=n;i++){s=s+x*x*x+4*c*c*c+y*y*y;x=x+h;y=y+h;c=c+h;}s=s*h/6;printf("s=%f\n",s);}结果:s=0.250000(三)复化高斯公式例:求220?x dx=⎰程序:#include <stdio.h>#include <math.h>main(){double a,b,h,s,x1,x2;int i,n;a=0;b=2;n=20;s=0;h=(b-a)/n;for(i=0;i<n;i++){x1=a+i*h+h/2*(1/1.732+1); x2=a+i*h+h/2*(1-1/1.732); s=s+x1*x1*x1+x2*x2*x2; }s=h/2*s;printf("s=%f\n",s);}结果:s=4.000000(四)迭代法例:求x=x2的解。

程序:#include "stdio.h"#include<math.h>main(){double x,xl,y,yl;int i,j;x=0.5;xl=x;y=0.5;yl=y;for(i=0;;i++){x=x*x;if(fabs(xl-x)<0.0001)break;else xl=x;}for(j=0;;j++){y=sqrt(y);if(fabs(yl-y)<0.0001)break;else yl=y;printf("x=%f,y=%f\n",x,y);}结果:x=0.000000,y=0.999915(五)牛顿迭代法y=f(x),求f(x*)=0。

成本计算方法和程序

成本计算方法和程序

成本计算方法和程序1、成本计算方法按一定的成本对象归集生产费用,以便计算出各种产品总成本和单位成本的方法。

最基本的成本计算方法有:品种法、分批法、分步法。

成本计算方法的确定在很大程度上取决于企业生产的特点和成本管理的要求。

例如,在大量大批单步骤生产的情况下,只要求按产品的品种计算成本,这种成本计算方法就稳定之为品种法。

又如,在单件小批多步骤的生产情况下,由于生产是按照客户的订单以及企业组织的生产批别组织生产,因此,产品成本就应该按照订单或生产批别进行计算,这种成本计算方法就称之为分批法。

而在大量大批多步骤生产的情况下,往往不仅要求按产品品种计算方法称之为分步法。

除此之外,还有一些可与基本方法结合使用的成本计算方法,例如,采用品种法计算成本,在产品品种规格繁多的情况下,为了简化成本计算工作,可以先将产品划分为若干类别,分别计算各类别产品成本,然后在各个类别内部采用一定的分配标准,计算出各个规模产品的成本,这种方法称之为分类法。

在定额管理制度比较健全的企业中,为了加强成本的定额控制,还可以以定额成本为基础,计算产品的实际成本,这种方法就称之为定额法。

需要指出的是,由于企业生产情况错综复杂,在实际工作中,各种成本计算方法往往是同时使用或结合使用的。

这主要取决于企业的生产特点,其目标是力求达到既要正确计算产品成本,又要简化成本的核算工作。

2、成本核算程序成本核算程序是指从生产费用发生开始,到算出完工产品总成本和单位成本为止的整个成本计算的步骤。

成本核算程序一般分为6个步骤。

一般分为以下几个步骤:(1)生产费用支出的审核。

对发生的各项生产费用支出,应根据国家、上级主管部门和本企业的有关制度、规定进行严格审核,以便对不符合制度和规定的费用,以及各种浪费,损失等加以制止或追究经济责任。

(2)确定成本计算对象和成本项目,开设产品成本明细账。

企业的生产类型不同,对成本管理的要求不同,成本计算对象和成本项目也就有所不同,应根据企业生产类型的特点和对成本管理的要求,确定成本计算对象和成本项目,并根据确定的成本计算对象开设产品成本明细账。

c语言程序设计中常用计算方法

c语言程序设计中常用计算方法

c语⾔程序设计中常⽤计算⽅法上完课过来整理⼀下笔记5551、穷举法1//百钱买百鸡问题(简化后)23 #include <stdio.h>4 #include <stdlib.h>56int main()7 {8int i,j,k;9for(i=0; i<20; i++)10 {11for(j=0; j<34; j++)12 {13 k=100-i-j;14if(i*15+j*9+k==300)15 {16 printf("%d %d %d\n",i,j,k);17 }18 }19 }20return0;21 }2、迭代法1//求解⼀元三次⽅程指定范围的根2 #include <stdio.h>3 #include <stdlib.h>4 #include <math.h>56double biroot(double,double);7double foo(double);89int main()10 {11double x1,x2;12do13 {14 scanf("%lf%lf",&x1,&x2);15 }while(foo(x1)*foo(x2)>0);1617 printf("%.2f\n",biroot(x1,x2));18return0;19 }20double biroot(double x1,double x2)21 {22double ret;23do24 {25 ret=(x1+x2)/2;26if(foo(ret)*foo(x1)>0)27 {28 x1=ret;29 }30else31 {32 x2=ret;33 }34 }while(fabs(x1-x2)>=1e-7);35 ret=(x1+x2)/2;36return ret;37 }38double foo(double x)39 {40return(x*x*x-7.7*x*x+19.2*x-15.3);41 }3、⽜顿迭代(⽜顿切线法)//求解⼀元三次⽅程在1.0附近的根#include <stdio.h>#include <stdlib.h>#include <math.h>double ntroot(double);double foo(double);double dfoo(double);int main(){double x0;scanf("%lf",&x0);printf("%.2f\n",ntroot(x0));return0;}double ntroot(double x){double x0;double f,df;do{x0=x;f=foo(x0);df=dfoo(x0);x=x0-f/df;}while(fabs(x-x0)>=1e-7);return x;}double foo(double x){return (x*x*x-7.7*x*x+19.2*x-15.3); }double dfoo(double x){return(3.0*x*x-15.4*x+19.2);}4、递推法(归纳法)//累加和累乘#include <stdio.h>#include <stdlib.h>#include <math.h>double getSum(int);int main(){int n;scanf("%d",&n);printf("%f\n",getSum(n));return0;}double getSum(int n){int i;double s=0.0;for(i=1;i<=n;i++){s+=pow(-1,i+1)/i;}return s;}//筛选法求素数#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 1000void getPrimeTab(int *,int);void initSieve(int*,int);int getNext(int*,int,int);int outPrimeTab(int *,int);int main(){int n;int cnt;int sieve[MAX_SIZE]={0};initSieve(sieve,MAX_SIZE);scanf("%d",&n);getPrimeTab(sieve,n);cnt=outPrimeTab(sieve,n);printf("total primes = %d\n",cnt); return0;}void initSieve(int*ps,int n){int i;for(i=2;i<n;i++){ps[i]=1;}}int outPrimeTab(int *ps,int n){int i,count=0;for(i=2;i<n;i++){if(ps[i]==1){if(count++%6==0){printf("\n");}printf("%8d",i);}}printf("\n");return count;}int getNext(int*ps,int p,int n){int q=p+1;while(q<n && ps[q]==0){q++;}return q;}void getPrimeTab(int *ps,int n){int p,q,i;for(p=2;p*p<n;p=getNext(ps,p,n)){for(q=p;p*q<n;q=getNext(ps,q,n)){for(i=p*q;i<n;i*=p){ps[i]=0;}}}}//梯形法求定积分#include <stdio.h>#include <stdlib.h>#include <math.h>double integrate(double(*pf)(double),double a,double b,int n); double my_fun(double x);int main(){double a,b;int n;printf(" 积分上限: a= ");scanf("%lf",&a);printf(" 积分下限:b= ");scanf("%lf",&b);printf(" 分割段数: n= ");scanf("%d",&n);printf("sin 函数积分值: %f\n",integrate(sin,a,b,n));printf("x^2 函数积分值: %f\n",integrate(my_fun,a,b,n)); return0;}double integrate(double(*pf)(double),double a,double b,int n) {int i;double h=(b-a)/n;double s=(pf(a)+pf(b))/2;for(i=1;i<=n-1;i++){s+=pf(a+i*h);}s=h*s;return s;}double my_fun(double x){return x*x; }。

数值计算方法程序设计

数值计算方法程序设计

数值计算方法程序设计数值计算方法程序设计介绍:数值计算方法是一种利用数学和计算机技术解决数值计算问题的方法。

它涉及到诸如求根、求解线性方程组、插值拟合线性方程、微分方程求解等问题。

本文档将详细介绍数值计算方法的相关内容,并给出程序设计的示例。

目录:1.数值计算方法概述1.1 数值计算方法的定义1.2 数值计算方法的分类2.数值计算方法的基础知识2.1 数值计算的误差分析①舍入误差②截断误差2.2 数值计算的稳定性分析①条件数②稳定性判断3.数值计算方法的常用算法3.1 一维非线性方程求根算法①二分法②牛顿法③割线法3.2 线性方程组求解算法①高斯消元法② LU分解法③迭代法3.3 插值拟合算法①拉格朗日插值法②牛顿插值法③样条插值法3.4 微分方程数值解算法①欧拉法②龙格-库塔法③隐式法4.数值计算方法的程序设计4.1 编程语言选择4.2 程序结构设计4.3 算法实现4.4 程序性能优化5.示例程序5.1 求解非线性方程的示例程序 5.2 求解线性方程组的示例程序 5.3 插值拟合的示例程序5.4 微分方程求解的示例程序附件:本文档所涉及的附件包括:1.示例程序源代码文件2.数学函数库文件3.算法实现代码文档法律名词及注释:1.版权:著作权法规定的对作品享有的独占性使用权。

2.许可证:著作权的授权凭证,用于合法使用他人作品。

3.开源软件:具有开放源代码的软件,使用者可以自由地使用、修改和分享。

计算方法上机程序

计算方法上机程序

1.对分+扫描Private Function f(x!)f = x ^ 4 - 5 * x ^ 2 + x + 2 End FunctionPrivate Sub Form_Click() Dim a!, b!, h!, c!, p!, q!, x!a = InputBox("输入a")b = InputBox("输入b")h = InputBox("输入h")x = aDo While x < bIf f(x) * f(x + h) <= 0 Thenp = x: q = x + hDo While Abs(q - p) > 0.00001 c = (p + q) / 2If f(c) = 0 ThenExit DoElseIf f(p) * f(c) < 0 Thenq = cElsep = cEnd IfEnd IfLoopPrint "["; p, q; "]"; cEnd Ifx = x + hLoopEnd Sub2.用牛顿法求a的立方根,精度要求0.000005 Private Sub Form_Click()Dim x0 As Single, x1 As SingleDim a As Integera = InputBox("输入a")If a = 0 ThenPrint "a的立方根=0"EndEnd Ifx1 = (a ^ 1 / 3)Dox0 = (x1)x1 = (x0 - (x0 ^ 3 - a) / (3 * x0 ^ 2))Loop While (Abs(x1 - x0)) > 0.000005 Print "a的立方根为:"; x1End Sub3.编写牛顿法求方程根1)x3-x2-2x-3=0(初值x0=2)Private Sub Form_Click()Dim x0 as Single,x1 as Singlex1=2Dox0=x1x1=x0-(x0^3-x0^2-2*x0-3)/(3*x0^2-2*x0-2) Loop while abs(x1-x0)>0.00001Print x1End sub2)x-sinx=1/2(初值x0=1)Private Sub Form_Click()Dim x0 As Single, x1 As Singlex1 = 1Dox0 = x1x1 = x0 - (x0 - Sin(x0) - 1 / 2) / (1 - Cos(x0))Loop While Abs(x1 - x0) > 0.00001Print x1End Sub4.列主元高斯消去法Private Sub Form_Click()Dim a(1 To 3, 1 To 4) As Single, t#, i!, j!, k!, r!, l#, x(1 To 3) As Single For i = 1 To 3For j = 1 To 4a(i, j) = InputBox("输入一个数")Print a(i, j);Next jPrintNext iFor k = 1 To 2r = kFor i = k + l To 3If Abs(a(i, k)) > Abs(a(r, k)) Then r = iNext iIf r <> k ThenFor i = 1 To 4t = a(k, i)a(k, i) = a(r, i)a(r, i) = tNext iEnd IfFor i = k + l To 3l = (a(i, k) / a(k, k))For j = k + l To 4a(i, j) = (a(i, j) - l * a(k, j)) Next jNext iNext kFor k = 3 To 1 Step -1s = 0For j = k + l To 3s = s + (a(k, j) * x(j)) Next jx(k) = (a(k, 4) - s) / a(k, k) Next kFor i = 1 To 3Print x(i),Next iEnd sub5.LU分解法Private Sub Form_Click()Const n = 4Dim a(1 To n, 1 To n) As Single, l(1 To n, 1 To n) As Single, u(1 To n, 1 To n) As SingleDim x(1 To n) As Single, y(1 To n) As Single, b(1 To n) As Single, s#, i!, j!, k!, r!For i = 1 To nFor j = 1 To na(i, j) = InputBox("输入a数组")Print a(i, j)Next jPrintNext iFor i = 1 To nb(i) = InputBox("输入b数组")Print b(i)PrintFor k = 1 To nFor j = k To ns = 0For r = 1 To k - 1s = s + l(k, r) * u(r, j)Next ru(k, j) = a(k, j) - sNext jFor i = k + 1 To ns = 0For r = 1 To k - 1s = s + (l(i, r) * u(r, k)) Next rl(i, k) = (a(i, k) - s) / u(k, k) Next iNext kFor i = 1 To ns = 0For k = 1 To i - 1s = s + l(i, k) * y(k)y(i) = b(i) - sNext iFor i = n To 1 Step -1s = 0For k = i + 1 To ns = s + (u(i, k) * x(k))Next kx(i) = (y(i) - s) / u(i, i)Next iFor i = 1 To nPrint x(i)Next iEnd Sub6.雅克比迭代Option Base 1Function cha(x!(), y!()) As SingleDim z As Single, i As Single, k As Singlen = 3z = Abs(x(1) - y(1))For i = 2 To nIf (z < Abs(y(i) - x(i))) Then z = Abs(x(i) - y(i))Next icha = zEnd FunctionPrivate Sub Form_Click()Dim a1, x(3) As Single, y(3) As SingleDim t As Single, s As Single, a(3, 3) As SingleDim i As Integer, j As Integer, k As Integer, n As Integer n = 3a1 = Array(10, -2, -1, -2, 10, -1, -1, -2, 5)b = Array(3, 15, 10)For i = 1 To n: y(i) = 0: Next ik = 1For i = 1 To 3For j = 1 To 3a(i, j) = a1(k)k = k + 1Next j, iFor k = 1 To 30For i = 1 To nx(i) = y(i)Next iFor i = 1 To nt = 0For j = 1 To nIf (i <> j )Then t = t + a(i, j) * x(j) Next jy(i) = ((b(i) - t) / a(i, i))Next iIf (cha(x, y) < 0.00001 )Then Print k;For i = 1 To nPrint y(i)Next iExit ForEnd IfNext kIf k > 30 Then Print "发散"End Sub7. 高斯-赛德尔迭代Option Base 1Function cha(x!(), y!()) As SingleDim z As Single, i As Single, k As Singlen = 3z = Abs(x(1) - y(1))For i = 2 To nIf z < Abs(y(i) - x(i)) Then z = Abs(x(i) - y(i))Next icha = zEnd FunctionPrivate Sub Form_Click()Dim a1, x(3) As Single, y(3) As SingleDim t As Single, s As Single, a(3, 3) As SingleDim i As Integer, j As Integer, k As Integer, n As Integer n = 3a1 = Array(10, -2, -1, -2, 10, -1, -1, -2, 5)b = Array(3, 15, 10)For i = 1 To n: x(i) = 0: Next ik = 1For i = 1 To 3For j = 1 To 3a(i, j) = a1(k)k = k + 1Next j, iFor k = 1 To 30For i = 1 To ny(i) = x(i)Next iFor i = 1 To nt = 0For j = 1 To nIf i <> j Then t = t + a(i, j) * x(j) Next jx(i) = (b(i) - t) / a(i, i)Next iIf cha(x, y) < 0.00001 Then Print k;For i = 1 To nPrint x(i)Next iEnd IfNext kIf k > 30 Then Print "发散"End Sub8.拉格朗日插值多项式,求在t=3.5处的函数值的近似值,节点由x,y数组给出Private Sub Form_Click()Const n = 3Dim p#, s!Dim x, y As Variantx = Array(1, 2, 3, 4)y = Array(4, 5, 14, 37)t = InputBox("input t ")p = 0For k = 0 To ns = 1For i = 0 To nIf (i <> k) Thens = s * ((t - x(i)) / (x(k) - x(i)))Next ip = p + (y(k) * s)Next kPrint pEnd Sub9.牛顿基本插值公式Private Sub Form_Click()Const n = 4Dim x(n) As Single, y(n) As Single, t#, p#, s# For i = 0 To (n)x(i) = InputBox("input x" & Trim(Str(i)))y(i) = InputBox("input y" & Trim(Str(i))) Next it = InputBox("input t")For k = 1 To nFor i = n To k(-1)y(i) = (y(i) - y(i - 1)) / ((x(i) - x(i - k)))Next ip = y(0)h = 1For i = 1 To nh = (h * (t - x(i - 1)))p = p + (h * y(i))Next iPrint "p="; pEnd Sub10.拟合Private Sub Form_Click()Dim l#, m#, n#, i%, j%, k%, t1#Dim x As Variant, y As Variantn = 7m = 2x = Array(0, 1, 2, 3, 4, 5, 6, 7)y = Array(0, 5, 3, 2, 1, 2, 4, 7)ReDim a(0 To m, 0 To m + 1) As Single, t(n) As Single For i = 0 To mFor k = 1 To ns = s + x(k) ^ i * y(k) Next ka(i, m + 1) = sFor j = 0 To ms = 0For k = 1 To ns = s + x(k) ^ (i + j) Next ka(i, j) = sNext jNext iFor i = 0 To mFor j = o To m + 1 Print a(i, j),Next jPrintNext iFor k = 0 To mr = kFor i = k + 1 To mIf Abs(a(i, k)) > Abs(a(r, k)) Then r = iEnd IfNext iIf r <> k ThenFor i = 0 To m + 1t1 = a(k, i)a(k, i) = a(r, i)a(r, i) = t1Next iEnd Ifl = 1For i = k + 1 To ml = a(i, k) / a(k, k)For j = k + 1 To m + 1a(i, j) = a(i, j) - l * a(k, j)Next jNext iNext kFor k = m To step - 1s = 0For j = k + 1 To ms = s + a(k, j) * t(j)Next jt(k) = (a(k, m + 1) - s) / a(k, k) Next kPrint "y="; t(0)For i = 1 To mIf t(i) >= 0 Then Print "+" Print t(i); "*x^;i;"Next iEnd Sub11.SimpsonFunction f!(x!)f = x + x * Exp(x)End FunctionPrivate Sub Form_Click() Dim b!, N!, h!, x!, s!, a!a = 0:b = 1: N = 8h = (b - a) / (2 * N)x = as = f(a)For i = 1 To Nx = x + hs = s + 4 * f(x)x = x + hs = s + 2 * f(x)Next is = h / 3 * (s - f(b))Print sEnd Sub(2)Private Sub form_click()Dim a As Single, b As Single, eps As Single, s As Single Dim x As Single, h As Single, t1 As Single, t As Singlea = InputBox("输入积分下限a")b = InputBox("输入积分上限b")eps = InputBox("输入精度要求eps")h = b - at2 = (h / 2) * (f(a) + f(b))Dot1 = t2s = 0For x = a + h / 2 To b Step hs = s + f(x)Next xt2 = t1 / 2 + (h / 2) * sh = h / 2Loop While Abs(t1 - t2) > eps Print "积分的近似值:"; t2End SubFunction f(x As Single) As Singlef = 1 / (1 + x * x)End Function12.用牛顿法求方程的附近根Private Sub Form_Click()Dim x#, x1#x1 = 1Dox = x1x1 = x - (x - Exp(-x)) / (1 + Exp(-x)) Loop While Abs(x1 - x) > 10 ^ (-5) Print x1End Sub。

数值计算方法程序

数值计算方法程序

数值分析[第二版]MATLAB调试报告(2015/2016学年第二学期)教师:许松林学号:1411111110姓名:王云峰班级:14信计目录第一章绪论 (3)例1.22 M脚本文件与M函数文件(P17) (3)例1.23 for...end循环结构(P19) (3)例1.24 while...end循环结构(P20) .. (4)例1.25 if...else...end条件结构(P20).. (4)例1.26 switch...case条件结构(P21) (4)例1.27 try...catch...end(P22) .. (5)例1.28 鸭兔同笼问题(P23) (5)例1.29 M函数文件求和(P23) (5)例1.30 return命令(P24) (6)例1.31 M文件执行过程(P25) (6)例1.32 多个子图窗口的建立(P26) (7)例1.33 二维曲线的绘制(P27) (8)例1.34 极坐标作图(P28) (8)例1.35 符号函数图形(P29) (9)例1.36 fplot命令(P30) (10)例1.37 ezpolar命令(P31) (10)例1.38 坐标轴与文字标(P33) (11)例1.39 空间曲线绘制(P35) (12)例1.40 三维网格图形与曲面图(P36) (12)例1.41 带等高线网格图(P38) (13)例1.42 带等高线表面图(P38) (13)例1.43 空间曲线符号作图(P40) (14)例1.44 方程微分(P40) (14)例1.45 方程积分(P41) (15)例1.46 求解常微分方程(P42) (15)例1.47 求非线性方程实根(P43) (15)例1.48 内建函数作图(P43) (16)例1.49 多项式求根(P44) (16)例1.50 线性代数方程组求解(P45) (17)第二章解线性方程租的直接法 (18)例2.17高斯消去法(P84) (18)例2.18列主元素法(P86) (19)第三章解线性方程组的迭代法 (20)例3.8雅可比迭代法(P107) (20)例3.9高斯-赛德尔迭代法(P109) (21)第四章非线性方程求根 (23)例4.12 方程求根的一般方法(P129) (23)例4.13 符号方程求根(P130) (23)例4.14 解符号方程(P130) (24)例4.15 用二分法求方程的实根的近似值(P130) (21)例4.16 牛顿迭代法求方程近似根(P132) (25)第五章插值法 (26)例5.12 拉格朗日插值多项式(P159) (26)例5.13 高次插值的龙格现象(P160) (26)例5.14 三次样条插值(P161) (27)第六章数值积分与数值微分 (27)例6.22 用变步长辛普森方法求积分(P200) (27)例6.23 用龙贝格方法求积分(P202) (29)第七章常微分方程的数值求解 (30)例7.8 简单欧拉方法/显式欧拉方法(P237) (30)例7.9 改进的欧拉法(P238) (30)例7.10 常微分的计算(P239) (31)例7.11 梯形公式计算积分近似值(P240) (31)注:(1)调试报告的程序全部来自课本教材;数值分析/何汉林主编. —2版. —北京:科学出版社,20411.9(2)目录中每个例题后面的括号为教材对应的页码;(3)根据课程内容报告节选前7章的MA TLAB程序;(4)报告中所有程序均在MA TLAB2013R版本中调试。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<iostream.h>
#include<math.h>
#include<stdio.h>
#define N 3 //方程的阶数
#define MaxK 100 //最大迭代次数
#define EPS 0.5e-4
static double aa[N][N]={{10,-1,-2},{-1,10,-2},{-1,-1,5}};
static double bb[N]={7.2,8.3,4.2};
double Max(double u[]) //求数组中最大值并返回,不仅可以比较三个元素的数组
{
int i,j=1;
double e,m=fabs(u[1]);//u[N+1]; 将第一个元素作为标记量,依次与后续元素比较查找最大值
/* for(i=1;i<N+1;i++)
{
u[i]=r[i];
}*/
for(i=2;i<N+1;i++)
{
if(m<=fabs(u[i]))
{
m=fabs(u[i]);
//u[i]=u[i+1];
}
/*else
{
m=u[i];
e=u[i];
u[i]=u[i+1];
u[i]=e;
}*/
}
return m;
}
int GaussSeidel(double a[][N+1],double b[],double x[])
//a传入系数矩阵(有效元素为a[1,1]~a[n,n]),b为方程组右边常数列
//x传入迭代初值并返回解向量(有效值为x[1]~x[n])
{
int k=1,i,j;
double s,t,m,xx[N+1],r[N+1];
for(i=1;i<N+1;i++)//{
xx[i]=x[i];
// printf("%lf ",xx[i]);
//}
/* for(i=1;i<N+1;i++)
{
for(j=1;j<N+1;j++)
printf("%lf ",a[i][j]);
printf("%lf\n",b[i]);
}*/
do
{
printf("k=%d:",k);
for(i=1;i<N+1;i++)
{
s=0,t=0;//置初值的位置很重要
if(a[i][i]==0)
return -1;
for(j=1;j<i;j++)
{
//printf(" a[%d][%d]=%lf ",i,j,a[i][j]);
//printf(" x[%d]=%lf ",j,x[j]);
s=s+a[i][j]*x[j];
}//printf("s=%lf\n",s);
for(j=i+1;j<N+1;j++)
{
//printf(" x[%d]=%lf",j,x[j]);
t=t+a[i][j]*x[j];
}//printf("t=%lf\n",t);
x[i]=(b[i]-s-t)/a[i][i];
printf(" x[%d]=%lf",i,x[i]);
}
printf("\n");
k++;
for(i=1;i<N+1;i++)//{
r[i]=x[i]-xx[i];
//printf("%lf ",r[i]);}
m=Max(r); //向量的无穷范数
//printf("m=%lf\n",m);
if(m<EPS)
return 1;
for(i=1;i<N+1;i++)
xx[i]=x[i]; //保存本次结果,用作下一次迭代结束判断精度是否满足}while(k<=MaxK);
return -2;
}//返回值:1正常结束,-1存在元素a[k,k]为0,-2迭代次数越界
void main()
{
int i,j,d;
double x[N+1];
double a[N+1][N+1],b[N+1];
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
a[i][j]=aa[i-1][j-1];
b[i]=bb[i-1];
x[i]=0;
}
d=GaussSeidel(a,b,x);
if(d==1)
{
printf("the root is:");
for(i=1;i<=N;i++)
printf(" x[%d]=%lf ",i,x[i]);
printf("\n");
}
else
printf("\nthe G-S method failed!\n"); }。

相关文档
最新文档