4 参数拟合
场景:[卫生统计] 4参数拟合方程 的参数求解
[卫生统计] 四参数拟合方程 的参数求解
卫生统计学中 有对检验数据进行分析之后通过计算得到 样品的测量分析结果.
其中包含 四参数拟合方程 的方法(4 Parameter Logistic)找了很久都未找到.
不知道有没有人知道如何求解.
方程如下:(四参数为A B C D)
Y = (A - D) / (1 + (X / C) ^ B)) + D
给出数据集:
x y
0.00 1.4735
0.025 1.214
0.05 1.0143
0.1 0.7362
0.25 0.3907
0.75 0.2135
求最合适的四参数ABCD值是多少?
答案是 a = 1.47 b = 1.229 c = 0.085 d = 0.12
------解决方案--------------------
Y = (A - D) / (1 + (X / C) ^ B)) + D 像这种方程,先归纳,然后改成y=ax^3 + bx^2 + cx + d的形式。
下面给你个算法,很好用,我一直用它做任意参数的拟合运算。
不知道符合lz的要求。
------解决方案--------------------
属于线性方程 关于这个方面的问题 你可一使用lingo来解答 很方便的
------解决方案--------------------
这个东西还是Matlab的强项,秒杀是必须的。
建议去Matlab论坛问一下。
------解决方案--------------------
上面的程序已经写得很清楚了。你直接调用polyfit函数就可以得出你要的结果。
double x(5)={0.00,0.025,0.05,0.1,0.25,0.75};
double y{5}={1.4735,1.214,1.0143,0.7362,0.3907,0.2135};
double beta(3);
polyfit(*x,*y,*beta,6,4);
最后beta里就是得到的A、B、C、D四个系数。
------解决方案--------------------
这个问题得用非线性拟合。
譬如买夸特/共轭梯度。。。等方法。
[卫生统计] 四参数拟合方程 的参数求解
卫生统计学中 有对检验数据进行分析之后通过计算得到 样品的测量分析结果.
其中包含 四参数拟合方程 的方法(4 Parameter Logistic)找了很久都未找到.
不知道有没有人知道如何求解.
方程如下:(四参数为A B C D)
Y = (A - D) / (1 + (X / C) ^ B)) + D
给出数据集:
x y
0.00 1.4735
0.025 1.214
0.05 1.0143
0.1 0.7362
0.25 0.3907
0.75 0.2135
求最合适的四参数ABCD值是多少?
答案是 a = 1.47 b = 1.229 c = 0.085 d = 0.12
------解决方案--------------------
Y = (A - D) / (1 + (X / C) ^ B)) + D 像这种方程,先归纳,然后改成y=ax^3 + bx^2 + cx + d的形式。
下面给你个算法,很好用,我一直用它做任意参数的拟合运算。
#define ABS(x) (x)>0?(x):-(x)
#define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;}
//求解线性方程组 A*x=B (n为矩阵维数)
void LinearSolve(double **A,double *B,double *x,int n)
{
int i,j,k,ik;
double mik,temp;
double **a,*b;
a=new double*[n];
for(i=0;i<n;i++) a[i]=new double[n];
b=new double[n];
for(i=0;i<n;i++)
{
b[i]=B[i];
for(j=0;j<n;j++) a[i][j]=A[i][j];
}
for(k=0;k<n;k++)
{
mik=-1;
for(i=k;i<n;i++)
if(ABS(a[i][k])>mik)
{
mik=ABS(a[i][k]);
ik=i;
}
for(j=k;j<n;j++)
SWAP(a[ik][j],a[k][j]);
SWAP(b[k],b[ik]);
b[k]/=a[k][k];
for(i=n-1;i>=k;i--)
a[k][i]/=a[k][k];
for(i=k+1;i<n;i++)
{
b[i]-=a[i][k]*b[k];
for(j=n-1;j>=k;j--)
a[i][j]-=a[i][k]*a[k][j];
}
}
for(i=n-1;i>=0;i--)
{
x[i]=b[i];
for(j=i+1;j<n;j++)
x[i]-=a[i][j]*x[j];
}
//删除内存
delete b;
for(i=0;i<n;i++) delete a[i];
}
//一般线性方程组拟合。n为参数个数,p为点数。
void linear(double **x,double *y,double *beta,int n,int p)
{
double **a,*b;
int i,j,k;
//a:分配内存
a=new double*[p];
for(i=0;i<p;i++)
a[i]=new double[p];
//a:p*p矩阵
for(i=0;i<p;i++)
for(j=0;j<p;j++)
{
a[i][j]=0;
for(k=0;k<n;k++)
a[i][j]+=x[k][i]*x[k][j]; //计算内积
}
//b:1*p矩阵
b=new double[p];
for(i=0;i<p;i++)
{
b[i]=0;
for(j=0;j<n;j++)
b[i]+=x[j][i]*y[j];
}
LinearSolve(a,b,beta,p); //求解beta
//a:删除内存
for(i=0;i<p;i++) delete a[i];
delete b;
}
//多项式拟合:输入点坐标(x,y),输出多项式参数beta
//n为点数,p为多项式系数个数
void polyfit(double *x,double *y,double *beta,int n,int p)
{
int i,j;
double **xx=new double*[n];
for(i=0;i<n;i++)
{
//多次拟合
xx[i]=new double[p];
for(j=0;j<p;j++)
{
if(0==j)
xx[i][j]=1;
else
xx[i][j]=pow(x[i],j); //连续函数
}
}
linear(xx,y,beta,n,p);
for(i=0;i<n;i++) delete xx[i];
delete xx;
}
不知道符合lz的要求。
------解决方案--------------------
属于线性方程 关于这个方面的问题 你可一使用lingo来解答 很方便的
------解决方案--------------------
这个东西还是Matlab的强项,秒杀是必须的。
建议去Matlab论坛问一下。
------解决方案--------------------
上面的程序已经写得很清楚了。你直接调用polyfit函数就可以得出你要的结果。
double x(5)={0.00,0.025,0.05,0.1,0.25,0.75};
double y{5}={1.4735,1.214,1.0143,0.7362,0.3907,0.2135};
double beta(3);
polyfit(*x,*y,*beta,6,4);
最后beta里就是得到的A、B、C、D四个系数。
------解决方案--------------------
这个问题得用非线性拟合。
譬如买夸特/共轭梯度。。。等方法。