using System; using static System.Console; using static System.Math; public static class steep{ public static (vector,vector,double,double) makestep(matrix H,matrix N,vector x,matrix iHess){ vector Hx=H*x,Nx=N*x; double xHx=x%Hx; double xNx=x%Nx; double E=xHx/xNx; vector grad=(Hx-E*Nx)*(2/xNx); vector dx=iHess*grad; // vector dx=grad; double dxHx=dx%Hx,dxNx=dx%Nx,dxHdx=dx%(H*dx),dxNdx=dx%(N*dx); double A=xHx,B=2*dxHx,C=dxHdx; double a=xNx,b=2*dxNx,c=dxNdx; Func f = z=>(A+B*z+C*z*z)/(a+b*z+c*z*z); double D=A*A*c*c+((B*B-2*A*C)*a-A*B*b)*c+A*C*b*b-B*C*a*b+C*C*a*a; double s1=-(Sqrt(D)+A*c-C*a)/(B*c-C*b); double s2= (Sqrt(D)-A*c+C*a)/(B*c-C*b); double f0=f(0),f1=f(s1),f2=f(s2); double s; if(f1acc*x.size); return (E,x); }//geneig }//class class main{ static void Main(string[] argv){ int n=8; if(argv.Length>0)n=int.Parse(argv[0]); matrix A = new matrix(n,n); matrix N = matrix.id(n); var rndA=new System.Random(1); var rndN=new System.Random(1); for(int i=0;i