void CSteepdnFsolver::CalR4Mode(double P1,double P2,double P3)
{
	int M=4,N=3;//
	double* x;
	x=new double[3];
	x[0]=p; x[1]=R; x[2]=Q1;
	int i,j,k,maxiter=10000;
	double alpha,gtg,dfgtdfg,normf0,normf1;
	static double fk[4],Df[4][3],xx[3],g[3],dfg[4];//
	k=0;	//iter count
	ff4(x,fk,P1,P2,P3);//
	normf0=0.0;
	for(i=0;i<M;i++) normf0=normf0+fk[i]*fk[i];
again: k=k+1;
	   ff4(x,fk,P1,P2,P3);//
	   fd4(x,Df);//
	   gtg=0.0;
	   for(i=0;i<N;i++)
	   {
		   g[i]=0.0;
		   for(j=0;j<M;j++) g[i]=g[i]+Df[j][i]*fk[j];
		   g[i]=2.0*g[i];
		   gtg=gtg+g[i]*g[i];
	   }
	   dfgtdfg=0.0;
	   for(i=0;i<M;i++)
	   {
		   dfg[i]=0.0;
		   for(j=0;j<N;j++) dfg[i]=dfg[i]+Df[i][j]*g[j];
		   dfgtdfg=dfgtdfg+dfg[i]*dfg[i];
	   }
	   alpha=0.5*gtg/dfgtdfg;
	   do
	   {
		   for(i=0;i<N;i++) xx[i]=x[i]-alpha*g[i];
		   ff4(xx,fk,P1,P2,P3);//
		   normf1=0.0;
		   for(i=0;i<N;i++) normf1=normf1+fk[i]*fk[i];
		   alpha=0.5*alpha;
	   }
	   while(normf1>normf0);
	   normf0=normf1;
	   for(i=0;i<N;i++) x[i]=xx[i];
	   normf1=sqrt(normf1);
	   if(normf1<EPSILON) goto endd;
	   if(k>maxiter) goto endd;
	   goto again;
endd: iter=k;
	  p=x[0];
	  R=x[1];
	  Q1=x[2];//
	  delete[] x;
}
int
main(int argc, char **argv) {
    QApplication a( argc, argv );
    QWidget w;
    QVBoxLayout *layout = new QVBoxLayout(&w);

    // with bug and direct rendering
    FontDisplay fd1(true, true);
    layout->addWidget(&fd1);

    FontDisplay fd2(false, true);
    layout->addWidget(&fd2);

    // with bug and indirect rendering: the real problem
    FontDisplay fd3(true, false);
    layout->addWidget(&fd3);

    FontDisplay fd4(false, false);
    layout->addWidget(&fd4);

    QLineEdit qle;
    layout->addWidget(&qle);

    QObject::connect(&qle, SIGNAL(textChanged(const QString &)),
                     &fd1,  SLOT(setText(const QString &)));
    QObject::connect(&qle, SIGNAL(textChanged(const QString &)),
                     &fd2,  SLOT(setText(const QString &)));
    QObject::connect(&qle, SIGNAL(textChanged(const QString &)),
                     &fd3,  SLOT(setText(const QString &)));
    QObject::connect(&qle, SIGNAL(textChanged(const QString &)),
                     &fd4,  SLOT(setText(const QString &)));

    QHBoxLayout *hlayout = new QHBoxLayout();
    layout->addLayout(hlayout);

    QCheckBox bold("bold");
    hlayout->addWidget(&bold);

    QObject::connect(&bold, SIGNAL(stateChanged(int)),
                     &fd1, SLOT(setBold(bool)));
    QObject::connect(&bold, SIGNAL(stateChanged(int)),
                     &fd2, SLOT(setBold(bool)));
    QObject::connect(&bold, SIGNAL(stateChanged(int)),
                     &fd3, SLOT(setBold(bool)));
    QObject::connect(&bold, SIGNAL(stateChanged(int)),
                     &fd4, SLOT(setBold(bool)));

    QCheckBox italic("italic");
    hlayout->addWidget(&italic);

    QObject::connect(&italic, SIGNAL(stateChanged(int)),
                     &fd1, SLOT(setItalic(bool)));
    QObject::connect(&italic, SIGNAL(stateChanged(int)),
                     &fd2, SLOT(setItalic(bool)));
    QObject::connect(&italic, SIGNAL(stateChanged(int)),
                     &fd3, SLOT(setItalic(bool)));
    QObject::connect(&italic, SIGNAL(stateChanged(int)),
                     &fd4, SLOT(setItalic(bool)));

    QSpinBox *fontsize = new QSpinBox(&w);
    fontsize->setValue(12);
    fontsize->setMinimum(1);
    hlayout->addWidget(fontsize);

    QObject::connect(fontsize, SIGNAL(valueChanged(int)),
                     &fd1, SLOT(setPointSize(int)));
    QObject::connect(fontsize, SIGNAL(valueChanged(int)),
                     &fd2, SLOT(setPointSize(int)));
    QObject::connect(fontsize, SIGNAL(valueChanged(int)),
                     &fd3, SLOT(setPointSize(int)));
    QObject::connect(fontsize, SIGNAL(valueChanged(int)),
                     &fd4, SLOT(setPointSize(int)));

    w.show();
    return a.exec();
}