📄 chazhi.txt
字号:
这是在应用程序中截取的一段用高斯列主次法写的插值曲线没,代码不是很难,插值曲线的阶次需要Rank是自己可以调整的signalmeter[]和msp430[]是两个要插值的数组。
void chazhiset::OnCompute()
{
// TODO: Add your control notification handler code here
CWnd * pWnd = GetDlgItem(IDC_CZPic);
pWnd->ShowWindow(SW_HIDE);
CWnd * pEdit = GetDlgItem(IDC_Display);
pEdit->ShowWindow(SW_SHOW);
for(int i=0;i<CollectNum;i++)
{
Rate[i]=signalmeter[i]/msp430[i];
}
//empty the array first
//begin
for (int k=0;k<50;k++)
{
S[k]=0; T[k]=0; v[k]=0; r[k]=0; p[k]=0; B[k]=0;
}
//end
//设置阶次Rank=m
UpdateData(TRUE);
int m=m_Rank;
for (k=0;k<=2*m;k++)
for(i=0;i<CollectNum;i++)
S[k]+=pow(msp430[i],k);
//
for (k=0;k<=m;k++)
for (i=0;i<CollectNum;i++)
T[k]+=signalmeter[i]*pow(msp430[i],k);
//
double a[50][50]={0};
//create the matrix
for (i=0;i<=m;i++)
for (int j=0;j<=m;j++)
{
a[i][j]=S[i+j];
a[i][m+1]=T[i];
}
//Gauss method begin
int q=0;
for (i=0;i<=m;i++)
{
int l=i;
q=0;
double e=a[i][0];
for (int j=i;j<=m;j++)
for (k=0;k<=m;k++)
{
if(fabs(a[j][k])<=fabs(e))
break;
e=a[j][k];q=k;l=j;
}
if(fabs(e)<1E-10)
{
// m_nRank=m-1;
// UpdateData(FALSE);
MessageBox("严重错误(高斯算法出现极小值作分母)\n\n因为:\n\n阶数过高或文件没有打开 ...","Stop",MB_OK|MB_ICONINFORMATION);
}
if (l!=i)
{
for (int k=0;k<=m+1;k++)
{
double d; d=a[i][k]; a[i][k]=a[l][k]; a[l][k]=d;
}
}
for (j=0;j<=m;j++)
{
if (j!=i && a[j][q]!=0)
{
double u=a[j][q]/a[i][q];
for(int k=0;k<=m+1;k++)
a[j][k]-=u*a[i][k];
}
}
v[i]=q;
}
for (i=0;i<=m;i++)
{
q=v[i];
r[q]=a[i][m+1]/a[i][q];
}
//Gauss method end
//
for (i=0;i<CollectNum;i++)
{
p[i]=0;
for (int j=0;j<=m;j++) p[i]+=r[j]*pow(msp430[i],j);
B[i]=((p[i]-signalmeter[i])/signalmeter[i]);
NewRate[i]=p[i]/msp430[i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -