Objective function, Jacobian matrix (definitions for logistic curve fitting problem)

f[t_]:=(x0/((1-x0/k)(E^(-r t))+x0/k));
values={0.04,0.35,1.05,1.9,1.98,1.97,1.99,1.999};
resid[r_,x0_,k_]=f[Range[0,7,1]]-values;
plot1=ListPlot[Transpose[{Range[0,7,1],values}],PlotMarkers->●]

J[r_,x0_,k_]=Table[{D[resid[r,x0,k][[i]],r],D[resid[r,x0,k][[i]],x0],
D[resid[r,x0,k][[i]],k]},{i,1,8}]//Simplify;
%//MatrixForm

Line Search Methods (In yellow, the direction-choosing step is highlighted -- i.e., the difference between the methods)

Gauss-Newton

pOld={10,10,10};
pNew={1,1,1};
tol=(10^(-8));
iter=0;
residuals={};
While[Norm[pOld-pNew]>tol,
pOld=pNew;
Δp=LeastSquares[J[pOld[[1]],pOld[[2]],pOld[[3]]],-resid[pOld[[1]],pOld[[2]],pOld[[3]]]];
α=1;
pNew=pOld+α Δp;
While[Norm[resid[pNew[[1]],pNew[[2]],pNew[[3]]],2]>Norm[resid[pOld[[1]],pOld[[2]],pOld[[3]]],2],
α/=2;
pNew=pOld+α Δp;
];
AppendTo[residuals, Norm[resid[pNew[[1]],pNew[[2]],pNew[[3]]],2]];
iter++
]
pNew
iter

ListLogPlot[residuals,PlotRange->All]

Steepest Descent

objectiveFunction[r_,x0_,k_] =resid[r,x0,k].resid[r,x0,k];
pOld={10,10,10};
pNew={1,1,1};
tol=(10^(-5));
iter=0;
ϵ=(10^(-10));
residuals={};
While[Norm[pOld-pNew]>tol,
pOld=pNew;
Δp=-D[objectiveFunction[r,x0,k],{{r,x0,k},1}]/.{r->pNew[[1]], x0->pNew[[2]], k->pNew[[3]]}//N;
α=1;
pNew=pOld+α Δp;
While[Norm[resid[pNew[[1]],pNew[[2]],pNew[[3]]],2]>Norm[resid[pOld[[1]],pOld[[2]],pOld[[3]]],2],
α/=2;
pNew=pOld+α Δp;
];
AppendTo[residuals, Norm[resid[pNew[[1]],pNew[[2]],pNew[[3]]],2]];
iter++
]
pNew
iter

ListLogPlot[residuals,PlotRange->All]

Newton

objectiveFunction[r_,x0_,k_] =resid[r,x0,k].resid[r,x0,k];
pOld={10,10,10};
pNew={2,0.1,2};
tol=(10^(-8));
iter=0;
residuals={};
While[Norm[pOld-pNew]>tol,
pOld=pNew;
Δp=LinearSolve[D[objectiveFunction[r,x0,k],{{r,x0,k},2}]/.{r->pNew[[1]], x0->pNew[[2]], k->pNew[[3]]}//N,
  -D[objectiveFunction[r,x0,k],{{r,x0,k},1}]/.{r->pNew[[1]], x0->pNew[[2]], k->pNew[[3]]}//N];
α=1;
pNew=pOld+α Δp;
While[Norm[resid[pNew[[1]],pNew[[2]],pNew[[3]]],2]>Norm[resid[pOld[[1]],pOld[[2]],pOld[[3]]],2],
α/=2;
pNew=pOld+α Δp;
];
AppendTo[residuals, Norm[resid[pNew[[1]],pNew[[2]],pNew[[3]]],2]];
iter++
]
pNew
iter

ListLogPlot[residuals,PlotRange->All]