How to solve unknown constant in an equation?
Show older comments
HI, im new to matlab and was wondering how would you input a command to help me solve an unknown constant in an equation.
I have a bunch of x,y points which i graphed and it gave me an exponential graph shape. The equation would be y=ae^bx. how would you type an command to help solve for a, and b. any help would be great. thank you!
Answers (2)
Walter Roberson
on 25 Nov 2017
Edited: Walter Roberson
on 25 Nov 2017
You would use the Curvefittting Toolbox for that. If you have that, try invoking
cftool
It is also possible to do a fit without that.
y = a * exp(b*x) implies log(y) = log(a) + b*x which is a linear fit that can be done with polyfit.
2 Comments
ian chiam
on 25 Nov 2017
Image Analyst
on 26 Nov 2017
Edited: Image Analyst
on 26 Nov 2017
Doing polyfit() minimizes the residuals (difference between actuals and fitted values) of the transformed equation. I'm not sure you'd get the same a and b that you'd get if you minimized the residuals on the original equation, like the a and b you'd get from using fitnlm directly as in my Answer. I doubt it. What do you think? Of course if you don't have the stats toolbox, transforming and using polyfit should give a respectable/close model. But I think, theoretically fitnlm() would be better, right?
Image Analyst
on 26 Nov 2017
If you have the Statistics and Machine Vision Toolbox, you can use fitnlm().
% Uses fitnlm() to fit a non-linear model (an exponential growth curve) through noisy data.
% Requires the Statistics and Machine Learning Toolbox, which is where fitnlm() is contained.
% Initialization steps.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 20;
% Create the X coordinates from 0 to 20 every 0.5 units.
X = 0 : 0.5 : 20;
% Define function that the X values obey.
a = 2 % Arbitrary sample values I picked.
b = 0.4
Y = a * exp(b * X); % Get a vector. No noise in this Y yet.
% Add noise to Y.
Y = Y + 250 * randn(1, length(Y));
% Now we have noisy training data that we can send to fitnlm().
% Plot the noisy initial data.
plot(X, Y, 'b*', 'LineWidth', 2, 'MarkerSize', 15);
grid on;
% Convert X and Y into a table, which is the form fitnlm() likes the input data to be in.
tbl = table(X', Y');
% Define the model as Y = a + exp(-b*x)
% Note how this "x" of modelfun is related to big X and big Y.
% x((:, 1) is actually X and x(:, 2) is actually Y - the first and second columns of the table.
modelfun = @(b,x) b(1) * exp(b(2)*x(:, 1));
beta0 = [2, .4]; % Guess values to start with. Just make your best guess - doesn't have to be exact.
% Now the next line is where the actual model computation is done.
mdl = fitnlm(tbl, modelfun, beta0);
% Now the model creation is done and the coefficients have been determined.
% YAY!!!!
% Extract the coefficient values from the the model object.
% The actual coefficients are in the "Estimate" column of the "Coefficients" table that's part of the mode.
coefficients = mdl.Coefficients{:, 'Estimate'}
% Create smoothed/regressed data using the model:
yFitted = coefficients(1) * exp(coefficients(2)*X);
% Now we're done and we can plot the smooth model as a red line going through the noisy blue markers.
hold on;
plot(X, yFitted, 'r-', 'LineWidth', 2);
grid on;
title('Exponential Regression with fitnlm()', 'FontSize', fontSize);
xlabel('X', 'FontSize', fontSize);
ylabel('Y', 'FontSize', fontSize);
legendHandle = legend('Noisy Y', 'Fitted Y', 'Location', 'north');
legendHandle.FontSize = 25;
% Set up figure properties:
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
% Get rid of tool bar and pulldown menus that are along top of figure.
% set(gcf, 'Toolbar', 'none', 'Menu', 'none');
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')

Categories
Find more on Electric Drives in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!