calling exponential function to non linear square

I want to fit data to an exponential function with the nonlinear least squares method, but MATLAB gives an error.
The code that I've written :
clear;
clc;
close all;
%mix code: ref_concrete_T8
tdata = ...
[1.2560 2.7203 6.0830 10.0306 20.0960 40.9837 80.0923 ];
sdata = ...
[1.3000 7.2567 23.0167 30.2733 31.9400 43.0667 43.4850 ];
%fun=x1*exp(-(x2/tdata)^x3)
fun = @(x)x(1)*exp(-(x(2)./tdata)^x(3))-sdata;
x0=[40,0.9,0.1];
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective');
x = lsqnonlin(fun,x0)
plot(tdata,sdata,'ko')
hold on
tlist = linspace(tdata(1),tdata(end));
plot(tlist,x(1)*exp(-(x(2)./tdata)^x(3)),'b-')
xlabel time(day)
ylabel strength(MPa)
title('exponential Fit to Data ref conc T8')
legend('Data','exponential Fit')
hold off

댓글 수: 2

In your function you can't raise a matrix to a power. The only thing that is possible is to raise the power of each element in the matrix and for that the line should be
fun = @(x)x(1)*exp(-(x(2)./tdata).^x(3))-sdata;
Can you put this down in the answer section Samiu? You can even get credit for it down there. Thanks in advance.

댓글을 달려면 로그인하십시오.

 채택된 답변

Samiu Haque
Samiu Haque 2020년 9월 13일
In your function you can't raise a matrix to a power. The only thing that is possible is to raise the power of each element in the matrix and for that the line should be
fun = @(x)x(1)*exp(-(x(2)./tdata).^x(3))-sdata;

댓글 수: 5

THANKS A LOT.
i have one more question, how can i calculate R-squared of this method?
what is the code?
another problem is that when matlab wants to plot the curvefitting, give bellow error:
Error using plot
Vectors must be the same lengths.
Error in asli (line 16)
plot(tlist,x(1)*exp(-(x(2)./tdata).^x(3)),'b-')
the code that i've written:
clc;
close all;
tdata = ...
[0.43083 0.87792 1.79667 2.59333 6.18667 24.68667 79.39000];
sdata = ...
[2.82 9.05 16.25 18.39 25.21 36.37 38.51];
fun = @(x)x(1)*exp(-(x(2)./tdata).^x(3))-sdata;
x0=[40,0.9,0.1];
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective');
[x,resnorm, residual] = lsqnonlin(fun,x0)
plot(tdata,sdata,'ko')
hold on
tlist = linspace(tdata(1),tdata(end));
plot(tlist,x(1)*exp(-(x(2)./tdata).^x(3)),'b-')
xlabel tdata
ylabel sdata
title('hyperbolic Fit to Data')
legend('Data','hyperbolic Fit')
hold off
For plotting the graph, you need equal no. of x and y values. That means two data sets must be equal. But in your code, tlist contains 100 elements whereas your function produces only 7 elements. For that reason, it is showing the error 'Vectors must be the same lengths'.
Use the following portion to solve the problem
syms tlist
y = x(1)*exp(-(x(2)./tlist).^x(3));
tlist = linspace(tdata(1),tdata(end));
y = subs(y);
plot(tlist,y,'b-')
thank you.
how can i calculate the value of R-squared??

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Get Started with Curve Fitting Toolbox에 대해 자세히 알아보기

질문:

2020년 9월 13일

댓글:

2020년 9월 14일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by