Gi(x)=Ai*exp((x-Bi)^2/Ci^2)
的洞晌高斯函数对数据点集进行函数逼近的拟合方法。
其实可以跟多项式拟合类比起来,不同的是多项式拟合是用幂函数系,
而高斯拟合是用高斯函数系。敬穗
使用高斯函数来进行拟合,优点在于计算积分十分简单快捷。这一点
在很多领域都有应用,特别是计算化学。著名的化学软件Gaussian98
就是建立在高斯基函数拟合的数学基础上的。
#include<iostream>
#include<iomanip.h>
using namespace std
int
change_num=0
void display(double **l_array,int r_size1,int r_size2)
//这个函数是用来显示矩阵(主要是用来调试使用的)
{
for(int i=0i<r_size1i++)
for(int j=0j<r_size2j++)
{
if(j!=0)
{
cout<<setprecision(4)<<setiosflags(ios_base::left)<<setw(7)<<l_array[i][j]
}
else
{
cout<<setprecision(4)<<setiosflags(ios_base::left)<<l_array[i][j]<<"
"
}
if(j+1==r_size2)
{
cout<<endl
}
}
cout<<resetiosflags(ios_base::left)
}
//这个下面的是算出上三毕吵饥角形
bool
Change(double **&array,int r_size,int c_size)
{
int k=0
double max=array[k][k]
int num=0
bool flag=false
while(k<r_size) //k表示现在在哪一行手返
{
max=array[k][k]
for(int i=ki<r_sizei++)
{
if(array[i][k]>max)
{
flag=true
max=array[i][k]
num=i //num表示最大行的行数
}
}
if(!flag)
{
num=k
}
if(max==0)
//如果一个列中的最大数是0的话那就说明这个矩阵的奇异矩阵
{
return
false
}
else if(k!=num)
{
double temp=0
for(int i=0i<c_sizei++)
{
temp=array[k][i]
array[k][i]=array[num][i]
array[num][i]=temp
change_num++
}
}
for(int i=ki<r_size-1i++)
{
double temp=array[i+1][k]
//这里的temp一定要保存的,因为直接使用array[i+1][k],在下面的碰乎计算中会改变
for(int j=k
j<c_sizej++)
{
array[i+1][j]-=((temp/array[k][k])*array[k][j])
}
}
k++
flag=false
}
return
true
}
double Rowlay(double **&array,int r_size, int c_size )
// 求行列式
{
double sum=1
for(int i=0i<r_sizei++)
{
sum*=array[i][i]
}
return sum
}
void Equation(double **&array,int r_size,
int c_size) //求方程组解
{
for(int i=0i<r_sizei++)
{
double temp1=array[i][i]
for(int j=ij<c_size
j++)
{
array[i][j]/=temp1
}
}
for(int i=1i<r_sizei++)
{
for(int j=i-1
j>=0j--)
{
double
temp2=array[j][i]
for(int h=ih<c_sizeh++)
{
array[j][h]-=(temp2*array[i][h])
}
}
}
}
int main()
{
int count=0
cin>>count
double **array=new double*[count]
for(int i=0
i<counti++)
{
array[i]=new double[count+1]
}
for(int i=0i<counti++)
for(int j=0j<count+1
j++)
{
cin>>array[i][j]
}
bool flag=Change(array,count,count+1)
if(flag)
{
cout<<endl
double
value=Rowlay(array,count,count+1)
if(change_num%2==1)
{
value*=-1
}
cout<<"行列式为
"<<value<<endl
Equation(array,count,count+1)
cout<<"方程解为"<<endl
for(int i=0i<count
i++)
{
char ch='x'+i
cout<<ch<<"= "<<array[i][count]<<endl
}
display(array,count,count+1)
}
else
{
cout<<"这个矩阵是奇异矩阵"<<endl
cout<<"这个方程无数解!!!"<<endl
cout<<"行列式为 "<<0<<endl
}
for(int j=0
j<countj++)
{
delete array[j]
}
delete
[]array
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)