[卫生统计] 四参数拟合方程 的参数求解
卫生统计学中 有对检验数据进行分析之后通过计算得到 样品的测量分析结果.
其中包含 四参数拟合方程 的方法(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.051.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;}
[解决办法]
属于线性方程 关于这个方面的问题 你可一使用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四个系数。
[解决办法]
这个问题得用非线性拟合。
譬如买夸特/共轭梯度。。。等方法。