- 论坛徽章:
- 0
|
原帖由 abcbuzhiming 于 2007-12-15 15:26 发表
我真是废物,大学毕业两年了,才开始编程,我甚至看不懂这句话在说什么……
这个也没有什么神奇的,看个例子就明白了。
给个用最小二乘法求解矛盾方程组计算药物EC50和Hill系数的程序,
//Name: EC50 calculator.
//Author: doctorjxd
//Date: 2007-12-1
//Compile by g++ ec50.cpp -llapack -lblas -lg2c -lblitz -L /usr/local/lib -I /usr/local/include -lm
// This program used LAPACK math libaray and blitz++ libaray.
#include<iostream>
#include <vector>
#include <cmath>
#include <blitz/array.h>
extern "C"
{
void dgels_(char* TRANS, int* M, int* N, int* NRHS, double* A, int* LDA, double* B, int* LDB, double* WORK, int* LWORK, int* INFO);
}
int main()
{
using namespace blitz;
using namespace std;
Array<double, 1> W(66);
vector<double> x,y;
double tmp;
for(;;)
{
if((cin >> tmp).eof()) break;
x.push_back(tmp);
if((cin >> tmp).eof())
{
cerr << "wrong number input data" << endl ;
return -1;
}
if(cin.fail())
{
cerr << "invalid format of input data" << endl;
return -1;
}
y.push_back(tmp);
}
int _w=x.size();
Array<double, 2> A(_w,2,fortranArray),B(_w,1,fortranArray);
for(int i=1;i<=_w;i++)
{
A(i,2)=x[i-1];
B(i,1)=y[i-1];
}
A(Range(1,_w),1)=1;
A(Range(1,_w),2)=log10(A(Range(1,_w),2));
B=log10(abs(1/B-1));
char trans='N';
int m=_w;
int n=2;
int nrhs=1;
int lda=_w;
int ldb=_w;
int lwork=66;
int ret=0;
dgels_(&trans, &m, &n, &nrhs, A.data(), &lda, B.data(), &ldb, W.data(), &lwork, &ret);
if(ret!=0)
{
cerr << "wong dgels" << endl;
return -1;
}
cout << "EC50: " << pow(10,(0-B(1,1)/B(2,1))) << endl << "Hill: " << B(2,1) << endl << "counts: " << _w << endl;
return 0;
} |
|
|