to be clear I would like it to be more like this graph

# curve fitting tool custom equation

24 views (last 30 days)

Show older comments

Michal Naim Ben Eliyahu
on 18 Apr 2022

Hi,

I used cf tool to get a function to describe my data but it seems to give me a straight line.

I know the custom equation is the right one is there anything else I can do to make the function more like my data?

Thank you all for your time!

##### 3 Comments

Sam Chak
on 18 Apr 2022

Edited: Sam Chak
on 18 Apr 2022

Can you provide the data t and h?

Technically, if , then , but since your equation was incorrect, it didn't fit.

The signal seems to slow down significantly in these 3 cycles, but regains momentum after 5.6 seconds.

The signal doesn't look like the one produced from a 2nd-order linear system. So your proposed model won't work. A rough estimation shows it could be from a 4th-order system.

### Accepted Answer

John D'Errico
on 18 Apr 2022

Edited: John D'Errico
on 18 Apr 2022

A general problem with the curve fitting toolbox is that it does not understand the mathematics of a model you pose to it. Not that this is truly a fixable problem. It is not, at least not until computers get far more intelligent than they are now. And I sort of fear that day anyway. :) But many users do not understand what has happened in a fit, and why they get a poor fit.

The curve fitting toolbox is just a search tool, that looks for good sets of parameters. But if it starts the search in a bad place, it gets lost. And I don't have your data, so I cannot easily show how to fit it.

@Torsten is totally correct, of course, that the data out past roughly t=7 is actively useless in the fit. Worse, it can cause some subtle problems. So toss that part.

But as I said, the biggest problem here is poor starting values. But there is also probably a lack of fit problem. That model is not perfect, would be my guess, because the initial transient seems to be larger than I would expect for an exponential decay. Again, lacking your data, it is hard to tell.

What are good starting values? e is the long term average behavior. from your plot, e should be around -11.

b is the exponential decay constant. It tells how fast the exponential drops off. You can guess that value from seeing the decay of each peak in the curve. As a wild guess from your plot, b might be around 0.3.

However, the most important parameter in this curve is the value of c. If you get that number wrong by as much as a factor of 2 too large or too small, your model will likely fit very poorly. A cosine curve goes through one period in a span of 2*pi. But from your plot, I can see roughly 5.5 oscillations in the interval from 4 to 6. That would suggest c should be approximately

c0 = 2*pi/(6 - 4)*5.5

fplot(@(t) cos(c0*t),[4 6])

So a good starting value for c would be roughly 17. As you can see from my plot, 5.5 periods in the span from 4 to 6, with that value for c.

a+e is the y-intercept of the curve at t==0. But we don't see any data near t==0. Luckily, the fit will tend to be insensitive to errors in your initial estimate of a and d. I don't even know the sign if a. But the magnitude of a should be roughly 4.

Again, without any real data, all of the above are just educated guesses.

The problem is, the curve fitting toolbox does not understand that it needs better startign values than just random numbers as start points. And if you get that initial estimate for c off by a factor of as much as 2, things will fit poorly.

When all is said and done however, my bet is the curve will fit poorly near the initial transient, since those peaks do not seem to behave as a truly exponential decay would. Again, that is just a guess. If you want better help in fitting that data, I would need to have the data itself.

##### 2 Comments

Sam Chak
on 19 Apr 2022

From your Book1 data, the output signal is quite large and appears to be some kind of a delayed signal. Thus, I rescaled and restructured for better fitting.

minh = min(h);

t1 = t/1e7;

h1 = h/abs(minh);

v = find(abs(t1) < 0.7);

[~, idx] = min(h1)

t2 = t1(idx:length(v)+1,:);

h2 = h1(idx:length(v)+1,:);

If you insist to use your teacher's suggested model:

then

Since the displacement d is known, the amplitude a can be determined.

With the shifted center is known, you need to determine only two parameters:

, .

If you consider the phase shift in the cosine wave, then above assumptions are invalid.

### More Answers (2)

Alex Sha
on 19 Apr 2022

if taking only part of data, for example, from No. 105 to No. 300, then the result will looks good

Sum Squared Error (SSE): 1111312565.89975

Root of Mean Square Error (RMSE): 2381.16821558602

Correlation Coef. (R): 0.969742933902271

R-Square: 0.940401357853383

Adjusted R-Square: 0.939783755344092

Determination Coef. (DC): 0.940401357853381

Chi-Square: -43481.4424771284

F-Statistic: 753.442740102336

Parameter Best Estimate

---------- -------------

a -291924.957940865

b 7.9210511350074E-7

c -1.68465029667797E-5

d -2953.68909153569

e -9546.50019773865

##### 0 Comments

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!