数值分析常见算法C++实现
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++实现的更多相关文章
- Hadoop学习笔记—12.MapReduce中的常见算法
一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...
- [Machine Learning] 机器学习常见算法分类汇总
声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多 ...
- acm常见算法及例题
转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法: (1)枚举. (poj17 ...
- 常见算法是js实现汇总(转载)
常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...
- paper 12:机器学习常见算法分类汇总
机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里南君先生为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困 ...
- AI - 机器学习常见算法简介(Common Algorithms)
机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...
- 前端常见算法的JS实现
1.冒泡排序 function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=ar ...
- 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...
- 常见算法(logistic回归,随机森林,GBDT和xgboost)
常见算法(logistic回归,随机森林,GBDT和xgboost) 9.25r早上面网易数据挖掘工程师岗位,第一次面数据挖掘的岗位,只想着能够去多准备一些,体验面这个岗位的感觉,虽然最好心有不甘告终 ...
随机推荐
- Monkey进行测试时如何屏蔽掉状态栏和音量键
我在学习的过程中使用简单的点击命令总是会触发到音量键和状态栏,由于我的测试机是虚拟按键所以也会触碰到 接下来说一下解决办法 全屏状态 adb shell settings put global po ...
- geth搭建以太坊私链及常用操作
一.下载安装geth客户端 https://www.ethereum.org/ 二.搭建私有链 1.准备创世区块配置文件 要运行私有链,我们就需要定义自己的创世区块,创世区块信息写在一个json格式的 ...
- virtualenv与virtualenvwrapper
一.Linux下安装.配置virtualenv pip3 install virtualenv # 创建虚拟环境env1 virtualenv env1 --no-site-packages --py ...
- 微信小程序开发过程中tabbar页面显示的相关问题及解决办法!
在微信小程序的开发过程中如果有使用过tabbar的同学,我相信一定会遇到一些困扰.为什么有些时候代码中明明已经在app.json里面增加了tabbar,可以页面中就是不显示呢?可不可以有些页面显示ta ...
- BZOJ 1827 洛谷 2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gather
[题解] 很容易想到暴力做法,枚举每个点,然后对于每个点O(N)遍历整棵树计算答案.这样整个效率是O(N^2)的,显然不行. 我们考虑如果已知当前某个点的答案,如何快速计算它的儿子的答案. 显然选择它 ...
- Python基础(八)装饰器
今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...
- 使用HTML5 Canvas API
一.检测浏览器支持情况 HTML5 Canvas的确是一个好东西,但是并不是所有浏览器都支持HTML5 Canvas的,这就要求我们在使用HTML5 Canvas前要检查浏览器是否支持这玩意儿. 在创 ...
- Oracle 关于几个随机函数sys_guid、dbms_random.random、dbms_random.value(取随机的结果集)
sys_guid():SYS_GUID (),是Oracle 8i 后提供的函数.SYS_GUID产生并返回一个全球唯一的标识符(原始值)由16个字节组成.更适合多个数据库数据集成时使用(--源自百度 ...
- A+B Problem IV
描述acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了. 输入 包含多组测试数据每组数据包含两个正数A,B(可能为小数且位数不大于400) 输出 ...
- Holedox Eating HDU4302 模拟
Problem Description Holedox is a small animal which can be considered as one point. It lives in a st ...