请教:高斯拟合cc++怎么实现

请教:高斯拟合cc++怎么实现,第1张

搜一下圆拟合的算法,先了解算法,然后在写代码,我能想到的是,因为半径已知,通过两个点,可以求出两个原因,然后通过其他的点排除一个点,这样就有了一个初始的圆心,然后,在这个点附近的一个小范围,通过循环找出最优解。请教:高斯拟合c/c++怎么实现

高斯拟合纳稿锋(Gaussian Fitting)即使用形如:

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12211466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存