How Can I Fit a Curve Using Least Squares for My Custom Equation?

Click For Summary
SUMMARY

The discussion focuses on fitting a custom curve to data using the equation y = ((1/A(x-B)^(C+1))+D)^-1, specifically utilizing MATLAB's lsqnonlin function. The user is struggling with variable naming conflicts and the implementation of the curve fitting process. A suggestion is made to use MATLAB's Curve Fitting Toolbox (cftool) to simplify the process by allowing users to input their custom equation directly and compute the coefficients A, B, C, and D efficiently.

PREREQUISITES
  • Understanding of MATLAB programming and syntax
  • Familiarity with nonlinear least squares fitting techniques
  • Knowledge of custom equations for curve fitting
  • Basic concepts of GUI development in MATLAB
NEXT STEPS
  • Explore MATLAB's Curve Fitting Toolbox (cftool) for custom equations
  • Learn about MATLAB's lsqnonlin function and its parameters
  • Investigate best practices for naming variables in MATLAB to avoid conflicts
  • Research techniques for integrating MATLAB functions into a GUI
USEFUL FOR

Researchers, data analysts, and engineers who need to fit custom equations to experimental data using MATLAB, particularly those interested in nonlinear fitting and GUI integration.

pazmush
Messages
32
Reaction score
0
The main problem is that I have no idea what I am doing. But second to that I am attempting to fit a curve to some data using the equation

y = ((1/A(x-B)^(C+1))+D)^-1

if that makes sense

I need to get the values for A,B,C and D and so have been looking into lsqnonlin but I am having problems. I may also be making life hard for myself as I am also trying to incorporate it into a GUI. Here is an example of what I have been trying

this is my function

Code:
   function F = myfun(x,Vg,Gd)
        A = x(1);
        B = x(2);
        C = x(3);
        D = x(4);
        
        F = (((1/(A.*(x-B)^(C+1)))+D)^-1)-Gd;
    end

this is how I attempt to use lsqnonlin

Code:
 cla reset;
     Vg = A.data(:,1);
     Id = A.data(:,6);
     Vd = A.data(:,5);
     Gd = (Id./Vd);
     
    
    x=lsqnonlin(@myfun,[1*10^9 -1 1 3*10^5],[],[],[],Vg,Gd);
    %Gd_new = (((1/(x(1).*(x-x(2))^(x(3)+1)))+x(4))^-1);
    %semilogy(Vg,Gd,'o',Vg,Gd_new);

can anyone give me a hand in either starting again or making this work?

thanks
 
Physics news on Phys.org
is this matlab?

I have a problem with the choice of variable names.

You know that array x() that you have chosen to pass 4 constants (A,B,C,D) in one shot into the function? How come that the scalar x, and I mean the only 'x' in the equation, has the same name? I think you have to decouple those two things, for starters.
 
If your problem is that you have vectors x and y that contain your data, and you want to find A, B, C and D for the equation shown as a fit to that data, try the curve fitting toolbox. Run cftool, select x and y as your data set, then under fit select custom equation and you can enter the equation in the form you want, and it will calculate the coefficients.
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 6 ·
Replies
6
Views
6K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 2 ·
Replies
2
Views
8K
  • · Replies 9 ·
Replies
9
Views
5K
  • · Replies 12 ·
Replies
12
Views
4K
  • · Replies 5 ·
Replies
5
Views
3K
Replies
7
Views
3K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K