1.1-有效数字丢失现象观察

 #include<bits./stdc++.h>
using namespace std;
double f1(double x)
{
return sqrt(x)*(sqrt(x+)-sqrt(x));
}
double f2(double x)
{
return sqrt(x)/(sqrt(x+)+sqrt(x));
}
int main()
{
double t=1.0;
while (t<=1e14)
{
printf("At t=%.lf %.19lf %.19lf\n",t,f1(t),f2(t));
t*=10.0;
}
printf("sqrt(x+1) = %.19lf sqrt(x) = %.19lf\n",sqrt(t+),sqrt(t));
printf("diff = %.19lf",sqrt(t+)-sqrt(t));
printf("sum = %.19lf",sqrt(t+)+sqrt(t));
}

1.2-n次插值的Lagrange形式

 #include<bits./stdc++.h>
using namespace std;
int n;
double x[],y[],xx,yy;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%lf %lf",&x[i],&y[i]);
scanf("%lf",&xx);
for (int i=;i<=n;i++)
{
double t=1.0;
for (int k=;k<=n;k++)
if (i!=k) t=t*(xx-x[k])/(x[i]-x[k]);
yy=yy+t*y[i];
}
printf("%.19lf",yy);
}

1.3-n次插值Newton形式

 #include<bits./stdc++.h>
using namespace std;
int n;
double x[],y[],v[],xx,yy,w;
int main()
{
int n;
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
scanf("%lf",&xx);
w=1.0,v[]=y[],yy=y[];
for (int k=;k<=n;k++)
{
v[k]=y[k];
for (int i=;i<=k-;i++)
v[k]=(v[i]-v[k])/(x[i]-x[k]);
w=w*(xx-x[k-]);
yy=yy+w*v[k];
}
printf("%.19lf",yy);
}

1.4-三次样条插值

 #include<bits./stdc++.h>
using namespace std;
int n,type;
double x[],y[],h[],xx,yy,w;
double sqr(double x)
{
return x*x;
}
double m[],A[],B[],a[],b[];
int main()
{
int n;
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
scanf("%lf",&xx);
scanf("%d",&type);
for (int i=;i<=n-;i++) h[i]=x[i+]-x[i];
if (type==)
{
scanf("%lf%lf",&m[],&m[n]);
a[]=0.0; b[]=2.0*m[];
a[n]=1.0; b[n]=2.0*m[n];
}else if (type==)
{
a[]=1.0;b[]=3.0/ h[] *(y[] - y[]);
a[n]=0.0;b[n]=3.0/(h[n-])*(y[n] - y[n-]);
}
for (int i=;i<=n-;i++)
{
a[i]=h[i-]/(h[i-]+h[i]);
b[i]=3.0*((-a[i]) / h[i-] * (y[i] - y[i-]) +
a[i] / h[i] * (y[i+] - y[i]));
}
A[]=-0.5*a[];
B[]=0.5*b[];
for (int i=;i<=n;i++)
{
A[i]=-a[i]/( + ( - a[i]) * A[i-]);
B[i]=(b[i]-(-a[i])*B[i-])/(+(-a[i])* A[i-]);
}
m[n+]=;
for (int i=n;i>=;i--) m[i]=A[i]*m[i+]+B[i];
for (int i=;i<=n-;i++)
if (xx>=x[i] && xx<=x[i+])
{
yy=( ( + * (xx-x[i]) / (x[i+]-x[i])) * sqr((xx-x[i+]) / (x[i]-x[i+])) * y[i] )+
( ( + * (xx-x[i+])/ (x[i]-x[i+])) * sqr((xx-x[i]) / (x[i+]-x[i])) * y[i+] )+
( (xx-x[i] ) * sqr( (xx-x[i+]) / (x[i]-x[i+]) ) * m[i] )+
( (xx-x[i+]) * sqr( (xx-x[i]) / (x[i+]-x[i]) ) *m[i+] );
printf("%.19lf\n",yy);
}
}

1.5-单变量数据拟合(最小二乘法)

 #include<bits./stdc++.h>
using namespace std;
int n,type;
double x[],y[],sx,sy,sxx,sxy,a,b;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
for (int i=;i<=n;i++)
{
sx+=x[i];
sy+=y[i];
sxx+=x[i]*x[i];
sxy+=x[i]*y[i];
}
double nn=n;
a=(sxx*sy-sx*sxy)/(nn*sxx-sx*sx);
b=(nn*sxy-sx*sy)/(nn*sxx-sx*sx);
printf("%.19lf %.19lf\n",a,b);
}

1.6-自动选取步长梯形法

 #include<bits./stdc++.h>
using namespace std;
double a,b,c,h,t1,t0,s,n;
double f(double x)
{
return /(+x*x);
}
int main()
{
scanf("%lf%lf%lf",&a,&b,&c);
h=(b-a)/2.0;
t1=(f(a)+f(b))*h;
n=;
while ()
{
t0=t1;
s=;
for (int k=;k<=n;k++) s=s+f(a+(*k-)*h/n);
t1=t0/2.0+s*h/n;
if (abs(t1-t0)<*c)
{
printf("%.19lf",t1);
break;
}else n=2.0*n;
}
}

1.7-Romberg 求积法

 #include<bits./stdc++.h>
using namespace std;
double a,b,c;
double t[][];
int k;
double f(double x)
{
return sqrt(x);
}
double why(double p,double q,int k)
{
double sum=;
double kk=k;
for (double i=p;i<=q;i+=1.0)
{
sum+=f(a+(*i-)*(b-a)/pow(,kk));
}
return sum;
}
int main()
{
scanf("%lf%lf%lf",&a,&b,&c);
t[][]=(b-a)/2.0*(f(a)+f(b));
k=;
while ()
{ t[][k]=0.5*(t[][k-]+(b-a)/(pow(,k-))*why(,pow(,k-),k) );
for (int m=;m<=k;m++)
{
t[m][k-m]=(pow(,m)*t[m-][k-m+]-t[m-][k-m])/(pow(,m)-);
}
if (abs(t[k][]-t[k-][])<c)
{
printf("%.19lf",t[k][]);
break;
}else k+=1.0;
}
}

2.1-顺序高斯消去法

 #include<bits./stdc++.h>
using namespace std;
int n,m;
double a[][],b[],c,x[],t;
double sum(int i)
{
double su=;
for (int j=i+;j<=n;j++) su+=a[i][j]*x[j];
return su;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%lf",&a[i][j]);
for (int i=;i<=n;i++) scanf("%lf",&b[i]);
scanf("%lf",&c);
for (int k=;k<=n-;k++)
{
if (abs(a[k][k])<=c)
{
printf("求解失败\n");
return ;
}
for (int i=k+;i<=n;i++)
{
t=a[i][k]/a[k][k];
b[i]=b[i]-t*b[k];
for (int j=k+;j<=n;j++) a[i][j]=a[i][j]-t*a[k][j];
}
}
if (abs(a[n][n])<=c)
{
printf("求解失败\n");
return ;
}else x[n]=b[n]/a[n][n];
for (int i=n-;i>=;i--) x[i]=(b[i]-sum(i))/a[i][i];
for (int i=;i<=n;i++) printf("%.19lf ",x[i]);
cout<<endl;
}

2.2-列主元高斯消去法

 #include<bits./stdc++.h>
using namespace std;
int n,m,ik;
double a[][],b[],c,x[],t;
double sum(int i)
{
double su=;
for (int j=i+;j<=n;j++) su+=a[i][j]*x[j];
return su;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%lf",&a[i][j]);
for (int i=;i<=n;i++) scanf("%lf",&b[i]);
scanf("%lf",&c);
for (int k=;k<=n-;k++)
{
t=-1e9;
for (int i=k;i<=n;i++)
if (abs(a[i][k])>t)
{
t=abs(a[i][k]);
ik=i;
}
if (t<=c) {
printf("求解失败\n");
return ;
}
if (ik!=k)
{
for (int i=;i<=m;i++) swap(a[ik][i],a[k][i]);
swap(b[ik],b[k]);
}
for (int i=k+;i<=n;i++)
{
t=a[i][k]/a[k][k];
b[i]=b[i]-t*b[k];
for (int j=k+;j<=n;j++) a[i][j]=a[i][j]-t*a[k][j];
}
}
if (abs(a[n][n])<=c)
{
printf("求解失败\n");
return ;
}else x[n]=b[n]/a[n][n];
for (int i=n-;i>=;i--) x[i]=(b[i]-sum(i))/a[i][i];
for (int i=;i<=n;i++) printf("%.19lf ",x[i]);
cout<<endl;
}

2.3-全主元高斯消去法

 #include<bits./stdc++.h>
using namespace std;
int n,m,ik,jk,d[];
double a[][],b[],c,x[],t,z[];
double sum(int i)
{
double su=;
for (int j=i+;j<=n;j++) su+=a[i][j]*z[j];
return su;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%lf",&a[i][j]);
for (int i=;i<=n;i++) scanf("%lf",&b[i]);
scanf("%lf",&c);
for (int i=;i<=n;i++) d[i]=i;
for (int k=;k<=n-;k++)
{
t=-1e9;
for (int i=k;i<=n;i++)
for (int j=k;j<=n;j++)
{
if (abs(a[i][j])>t)
{
t=abs(a[i][j]);
ik=i;
jk=j;
}
}
if (t<=c)
{
printf("求解失败\n");
return ;
}
if (ik!=k)
{
for (int i=;i<=m;i++) swap(a[ik][i],a[k][i]);
swap(b[ik],b[k]);
}
if (jk!=k)
{
for (int i=;i<=n;i++) swap(a[i][jk],a[i][k]);
swap(d[jk],d[k]);
}
for (int i=k+;i<=n;i++)
{
t=a[i][k]/a[k][k];
b[i]=b[i]-t*b[k];
for (int j=k+;j<=n;j++) a[i][j]=a[i][j]-t*a[k][j];
}
}
z[n]=b[n]/a[n][n];
for (int i=n-;i>=;i--) z[i]=(b[i]-sum(i))/a[i][i];
for (int j=;j<=n;j++) x[d[j]]=z[j];
for (int i=;i<=n;i++) printf("%.19lf ",x[i]);
cout<<endl;
}

2.4-LU 直接分解法

 #include<bits./stdc++.h>
using namespace std;
int n,m,ik,jk,d[];
double a[][],b[],c,x[],y[];
double l[][],u[][];
double sum2(int p,int i)
{
double su=;
for (int j=;j<=p;j++) su+=l[i][j]*y[j];
return su;
}
double sum3(int p,int i)
{
double su=;
for (int j=p;j<=n;j++) su+=u[i][j]*x[j];
return su;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%lf",&a[i][j]);
for (int i=;i<=n;i++) scanf("%lf",&b[i]);
scanf("%lf",&c);
for(int k=;k<=n;k++)
{
for(int j=k;j<=n;j++)
{
double su=;
for(int r=;r<=k-;r++) su+=(l[k][r]*u[r][j]);
u[k][j]=a[k][j]-su;
}
for(int i=k;i<= n;i++)
{ double su=;
for(int r=;r<=k-;r++) su+=(l[i][r]*u[r][k]);
l[i][k]=(a[i][k]-su)/u[k][k];
}
}
y[]=b[];
for (int i=;i<=n;i++) y[i]=b[i]-sum2(i-,i);
x[n]=y[n]/u[n][n];
for (int i=n-;i>=;i--) x[i]=(y[i]-sum3(i+,i))/u[i][i];
for (int i=;i<=n;i++) printf("%.19lf\n",x[i]);
cout<<endl;
}

2.5-Jacobi 迭代算法

 #include<bits./stdc++.h>
using namespace std;
int n,k,M;
double a[][],b[],c,x[],y[],g[];
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
for (int j=;j<=n;j++) scanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
for (int i=;i<=n;i++) scanf("%lf",&y[i]);
scanf("%lf%d",&c,&M);
k=;
for (int i=;i<=n;i++)
{
if (abs(a[i][i])<c)
{
printf("求解失败2\n");
return ;
}
double t=a[i][i];
for (int j=;j<=n;j++)
{
a[i][j]=-a[i][j]/t;
}
a[i][i]=;
g[i]=b[i]/t;
}
while ()
{
for (int i=;i<=n;i++)
{
double sum=;
for (int j=;j<=n;j++) if (i!=j) sum+=a[i][j]*y[j];
x[i]=g[i]+sum;
}
double sum=;
for (int i=;i<=n;i++)
{
sum+=abs(x[i]-y[i]);
}
if (sum<c)
{
for (int i=;i<=n;i++) printf("%.19lf\n",x[i]);
printf("%d\n",k);
return ;
}else
if (k<M)
{
k=k+;
for (int i=;i<=n;i++) y[i]=x[i];
for (int i=;i<=n;i++) printf("%.15lf ",y[i]);
printf("\n");
}else
{
printf("求解失败1\n");
return ;
}
}
}

2.6-Seidel 迭代算法

 #include<bits./stdc++.h>
using namespace std;
int n,k,M;
double a[][],b[],c,x[],y[],g[];
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
for (int j=;j<=n;j++) scanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
for (int i=;i<=n;i++) scanf("%lf",&y[i]);
scanf("%lf%d",&c,&M);
k=;
for (int i=;i<=n;i++) x[i]=y[i]; for (int i=;i<=n;i++)
{
if (abs(a[i][i])<c)
{
printf("求解失败2\n");
return ;
}
double t=a[i][i];
for (int j=;j<=n;j++)
{
a[i][j]=-a[i][j]/t;
}
a[i][i]=;
g[i]=b[i]/t;
}
while ()
{
for (int i=;i<=n;i++)
{
double sum=;
for (int j=;j<=n;j++) if (i!=j) sum+=a[i][j]*x[j];
x[i]=g[i]+sum;
}
double sum=;
for (int i=;i<=n;i++)
{
sum+=abs(x[i]-y[i]);
}
if (sum<c)
{
for (int i=;i<=n;i++) printf("%.19lf\n",x[i]);
printf("%d\n",k);
return ;
}else
if (k<M)
{
k=k+;
for (int i=;i<=n;i++) y[i]=x[i];
for (int i=;i<=n;i++) printf("%.15lf ",y[i]);
printf("\n");
}else
{
printf("求解失败1\n");
return ;
}
}
}

2.7-松弛迭代算法

 #include<bits./stdc++.h>
using namespace std;
int n,k,M;
double a[][],b[],c,x[],y[],g[],w;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
for (int j=;j<=n;j++) scanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
for (int i=;i<=n;i++) scanf("%lf",&y[i]);
scanf("%lf",&w);
scanf("%lf%d",&c,&M);
k=;
for (int i=;i<=n;i++) x[i]=y[i]; for (int i=;i<=n;i++)
{
if (abs(a[i][i])<c)
{
printf("求解失败2\n");
return ;
}
double t=a[i][i];
for (int j=;j<=n;j++)
{
a[i][j]=-w*a[i][j]/t;
}
a[i][i]=-w;
g[i]=w*b[i]/t;
}
while ()
{
for (int i=;i<=n;i++)
{
double sum=;
for (int j=;j<=n;j++) if (i!=j) sum+=a[i][j]*x[j];
x[i]=g[i]+sum;
}
double sum=;
for (int i=;i<=n;i++)
{
sum+=abs(x[i]-y[i]);
}
if (sum<c)
{
for (int i=;i<=n;i++) printf("%.19lf\n",x[i]);
printf("%d\n",k);
return ;
}else
if (k<M)
{
k=k+;
for (int i=;i<=n;i++) y[i]=x[i];
for (int i=;i<=n;i++) printf("%.15lf ",y[i]);
printf("\n");
}else
{
printf("求解失败1\n");
return ;
}
}
}

2.8-对分法求根

 #include<bits./stdc++.h>
using namespace std;
double d,c,a[],b[],A,B,x[];
double f(double x)
{
return x*x*x-*x+1.0;
}
int k;
double ff;
int main()
{
scanf("%lf%lf",&d,&c);
scanf("%lf%lf",&A,&B);
a[]=A;b[]=B;k=;
while ()
{
x[k]=(a[k]+b[k])/;
ff=f(x[k]);
if (abs(ff)<d)
{
printf("%.19lf\n",x[k]);
break;
}
if (f(a[k])*f(x[k]) < )
{
a[k+]=a[k];
b[k+]=x[k];
}else
{
a[k+]=x[k];
b[k+]=b[k];
}
if (b[k+]-a[k+]<=c)
{
printf("%.19lf\n",(a[k+]+b[k+])/);
}else k=k+;
}
}

2.9-松弛法迭代求根

#include<bits./stdc++.h>
using namespace std;
double d,c,A,B,x[],w[];
double f(double x)
{
return (x*x*x+1.0)/3.0;
}
double ff(double x)
{
return x*x;
}
int k;
int main()
{
scanf("%lf%lf",&x[],&c);
while ()
{
w[k]=/(-ff(x[k]));
x[k+]=(-w[k])*x[k]+w[k]*f(x[k]);
if (abs(x[k+]-x[k])<c )
{
printf("%.19lf\n",x[k+]);
break;
}else k=k+;
}
}

2.10-牛顿法求根

 #include<bits./stdc++.h>
using namespace std;
double d,c,A,B,x[],w[];
double f(double x)
{
return x*x*x-3.0*x+;
}
double ff(double x)
{
return *x*x-;
}
int k;
int main()
{
scanf("%lf%lf",&x[],&c);
k=;
while()
{
x[k+]=x[k]-f(x[k])/ff(x[k]);
if (abs(x[k+] -x[k]) < c)
{
printf("%.19lf\n",x[k+]);
break;
}else k=k+;
}
}

数值分析常见算法C++实现的更多相关文章

  1. Hadoop学习笔记—12.MapReduce中的常见算法

    一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...

  2. [Machine Learning] 机器学习常见算法分类汇总

    声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多 ...

  3. acm常见算法及例题

    转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题  初期:一.基本算法:     (1)枚举. (poj17 ...

  4. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  5. paper 12:机器学习常见算法分类汇总

    机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里南君先生为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困 ...

  6. AI - 机器学习常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

  7. 前端常见算法的JS实现

    1.冒泡排序 function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=ar ...

  8. 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

    今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...

  9. 常见算法(logistic回归,随机森林,GBDT和xgboost)

    常见算法(logistic回归,随机森林,GBDT和xgboost) 9.25r早上面网易数据挖掘工程师岗位,第一次面数据挖掘的岗位,只想着能够去多准备一些,体验面这个岗位的感觉,虽然最好心有不甘告终 ...

随机推荐

  1. flex多列布局遇到的问题,和解决方案

    flex布局无疑是简单.易用的,他让我我们的布局更加简单和快速,但是在使用flex进行多列布局的时候,我相信很多人会遇到下面的情况: 这种情况是因为我们使用了justify-content: spac ...

  2. 洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通

    [题解] 原来线段树还可以这么玩.. 我们用线段树维护连通性.对于一个矩形,我们用4个标记维护4个点的联通情况,再用两个标记维护右边两个点与它们右边的与它们在同一行的点的联通情况. 画图表示,就是 另 ...

  3. Vue2.0如何自定义时间过滤器

    我们知道Vue2.0开始不再支持自带的过滤器,需要我们自己去自定义过滤器,方法如下:           我们可以自己定义一个时间过滤器,在此引用了一个日期处理类库(Moment.js)可以很快的实现 ...

  4. cocos2dx 2.1.x 退出SDK相关界面后EGLView 不刷新渲染

    报错内容为: [3390:1456879] failed to call contextcocos2d: surface size: 0x0[3390:1456879] Failed to make ...

  5. HDU1507 Uncle Tom's Inherited Land*

    题目是跟 zoj1516是一样的,但多了匹配后的输出 详解zoj1516可见http://www.cnblogs.com/CSU3901130321/p/4228057.html #include & ...

  6. [luoguP1516] 青蛙的约会(扩展欧几里得)

    传送门 对于数论只会gcd的我,也要下定决心补数论了 列出方程 (x + t * m) % l = (y + t * n) % l 那么假设 这两个式子之间相差 num 个 l,即为 x + t * ...

  7. IDA 宏定义

    /* This file contains definitions used by the Hex-Rays decompiler output. It has type definitions an ...

  8. codevs——1530 大质数

    1530 大质数  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师 ...

  9. Hackerrank manasa-and-combinatorics(数学推导)

    题意:有n个字符A,2n个字符B,问你能用这3n个字母组成多少种字符串,使得组成的字符串所有前缀与后缀的B的数目都大于等于A的数目,对答案mod 99991 分析:类似卡特兰数 ans=总方案数-存在 ...

  10. 自己定义ViewpagerIndicator (仿猫眼,加入边缘回弹滚动效果)

    一.概述 今天主要来分享个自己定义viewpagerindicator.效果主要是仿 猫眼电影 顶部的栏目切换.也就是我们常说的indicator,难度简单,为了让滑动时效果更炫酷,我在滑动到左边第一 ...