docs: private DoubleMatrix solveEquationSystem(){
  		DoubleMatrix R=new DoubleMatrix(partition.getLength());
  		DoubleMatrix M=new DoubleMatrix(partition.getLength(),partition.getLength());
  		DoubleMatrix partitionAsVector=new DoubleMatrix(partition.getPoints());
  		DoubleMatrix shiftedPartition=new DoubleMatrix(partition.getLength());
  		for(int j=1; j<shiftedPartition.length;j++) {
  			shiftedPartition.put(j, partition.getPoint(j-1));
  		}
  		DoubleMatrix partitionIncrements= partitionAsVector.sub(shiftedPartition).put(0,1);
  		DoubleMatrix kernelValues=new DoubleMatrix(partition.getLength()-1);
  		DoubleMatrix M1_1= new DoubleMatrix(1);
  		DoubleMatrix MFirstCol= new DoubleMatrix(partition.getLength()-1);
  		DoubleMatrix MSubDiagonal= new DoubleMatrix(partition.getLength()-1);
  		DoubleMatrix MSubMatrix= new DoubleMatrix(partition.getLength()-1,partition.getLength()-1);
  		DoubleMatrix MSubMatrixSum= new DoubleMatrix(partition.getLength()-1);
  
  		for(int i=0;i<independentValues.length;i++){
  
  			DoubleMatrix oneZeroVector= new DoubleMatrix(partition.getLength());
  			DoubleMatrix kernelSum= new DoubleMatrix(partition.getLength());
  			DoubleMatrix shiftedKernelVector= new DoubleMatrix(partition.getLength());
  
  
  			for(int r=0;r<partition.getLength()-1;r++){
  				oneZeroVector.put(r, 1);
  				kernelValues.put( r,kernel.density((partition.getIntervalReferencePoint(r)-independentValues[i])/bandwidth));
  				shiftedKernelVector.put(r+1,kernelValues.get( r) );
  				kernelSum=kernelSum.add(oneZeroVector.mmul(kernelValues.get(r)));
  			}
  
  			R=R.add(shiftedPartition.neg().add(independentValues[i]).mul(shiftedKernelVector)
  					.add(partitionIncrements.mul(kernelSum)).mul(dependentValues[i]));
  
  			M1_1=M1_1.add( kernelSum.get(0));
  
  			MFirstCol=MFirstCol.add(
  					partitionAsVector.getRange(0,partitionAsVector.length-1).neg().add(independentValues[i])
  					.mul(kernelValues).add(
  							partitionIncrements.getRange(1,partitionAsVector.length)
  							.mul(kernelSum.getRange(1, kernelSum.length))));
  
  			MSubDiagonal=MSubDiagonal.add(
  					partitionAsVector.getRange(0,partitionAsVector.length-1).neg().add(independentValues[i])
  					.mul(partitionAsVector.getRange(0,partitionAsVector.length-1).neg().add(independentValues[i]))
  					.mul(kernelValues).add(
  							partitionIncrements.getRange(1,partitionAsVector.length)
  							.mul(partitionIncrements.getRange(1,partitionAsVector.length)
  									.mul(kernelSum.getRange(1, kernelSum.length)))));
  
  			MSubMatrixSum=MSubMatrixSum.add(
  					partitionAsVector.getRange(0, partitionAsVector.length-1).neg().add(independentValues[i])
  					.mul(kernelValues).add(
  							partitionIncrements.getRange(1, partitionIncrements.length)
  							.mul(kernelSum.getRange(1, kernelSum.length))));
  		}
  
  		DoubleMatrix partitionIncrementMatrix= new DoubleMatrix(partition.getLength()-1,partition.getLength()-1);
  		DoubleMatrix matrixDefine= DoubleMatrix.ones(partition.getLength()-1);
  		for(int m=0;m<matrixDefine.length-1;m++) {
  			matrixDefine.put(m, 0);
  			partitionIncrementMatrix.putColumn(m, matrixDefine.mul(partitionIncrements.get(m+1)));
  		}
  
  		MSubMatrix=partitionIncrementMatrix.mulColumnVector(MSubMatrixSum);
  		MSubMatrix=MSubMatrix.add(MSubMatrix.transpose()).add(DoubleMatrix.diag(MSubDiagonal));
  
  		int[] rowColIndex =new int[partition.getLength()-1];
  		for(int n=0;n<rowColIndex.length;n++) {
  			rowColIndex[n]=n+1;
  		}
  
  		M.put(0,0,M1_1.get(0));
  		M.put(rowColIndex, 0, MFirstCol);
  		M.put(0, rowColIndex, MFirstCol.transpose());
  		M.put(rowColIndex, rowColIndex, MSubMatrix);
  
  		return Solve.solve(M, R);
  	}