Fitting equation in matlab

I have an equation of the form y= a0+a1log(x)+ a2log(1/x)
I want to use polyfit but I don't know how to fix the degree of the polynomial in this case. Can anyone help me please?

 採用された回答

Matt J
Matt J 2013 年 8 月 16 日
編集済み: Matt J 2013 年 8 月 16 日

1 投票

Since log(1/x)=-log(x) your equation model has redundant terms. It is equivalent to
y = a0+(a1-a2)*log(x)
= A+B*log(x)
where a0 has been relabeled as A and B has replaced a1-a2.
You could fit A and B, I suppose, by doing
AB=polyfit(log(x),y,1);
A=AB(2);
B=AB(1);

18 件のコメント

sisay
sisay 2013 年 8 月 16 日
yes but how can I get the values of a1 and a2 ?
Matt J
Matt J 2013 年 8 月 16 日
If you agreed with me when I told you that your equation has redundant terms, then you shouldn't be interested in a1 and a2 anymore. You should be interested only in B.
sisay
sisay 2013 年 8 月 16 日
Yeah. But I want to know the values of a1 and a2...those are the two terms I want to find.
Matt J
Matt J 2013 年 8 月 16 日
編集済み: Matt J 2013 年 8 月 16 日
There is no unique solution for a1 and a2. Once you have B, any pair of a1 and a2 satisyfing
B=a1-a2
will produce the same fit. That's what happens when you try to fit an equation with redundant terms.
sisay
sisay 2013 年 8 月 16 日
Yes Matt I can understand you ...even My original question is y= a0+a1log(x/22)+a2log(22/x)...
Matt J
Matt J 2013 年 8 月 16 日
編集済み: Matt J 2013 年 8 月 16 日
Yes Matt I can understand you
Good! Then your question is answered. Tada!
sisay
sisay 2013 年 8 月 16 日
yeah.. but what about the case with the nominator 22
Matt J
Matt J 2013 年 8 月 16 日
編集済み: Matt J 2013 年 8 月 16 日
It doesn't change anything. After re-arranging the equation, you will have
y = a0+(a1-a2)log(x)+(a2-a1)*log(22)
= A+B*log(x)
which is the same form as before with the change of variables
A=a0+(a2-a1)*log(22)
B=a2-a1
You could also rewrite as
y=A+B*(log(x/22)
and do
AB=polyfit(log(x/22),y,1)
Image Analyst
Image Analyst 2013 年 8 月 16 日
Why not just say a2=0? Since it's only the sum that has to be a certain value (B), then just say a2=0, and a1=B and be done with it.
sisay
sisay 2013 年 8 月 16 日
tnx..a2 can't be zero because of some physical reasoning...
Matt J
Matt J 2013 年 8 月 16 日
編集済み: Matt J 2013 年 8 月 21 日
If there are physical constraints on the coefficients, the fitting algorithm will need to consider those constraints. The entire solution that I've given you could be invalidated if you're holding back information like that.
sisay
sisay 2013 年 8 月 16 日
No am not holding back any information. a1 and a2 are coefficients for log(x) and log(1/x) that increases upward and the other in the opposite direction .
Walter Roberson
Walter Roberson 2013 年 8 月 16 日
If a2 cannot be 0, can it be 1?
Image Analyst
Image Analyst 2013 年 8 月 16 日
But what you're saying doesn't make sense. See my code below where I set a2 = 0 and it does the fit just fine. If you think it doesn't then say why. If you want some different value of a2, then pick one and I'll adjust the a1 and it will fit just fine again.
sisay
sisay 2013 年 8 月 16 日
編集済み: sisay 2013 年 8 月 16 日
Thank you for your help I understand you perfectly .To tell you briefly, in my case x refers to the depth of water and y is the concentration data . coefficients a1 and a2 should be calculated and they are assumed to relate to some physical variables that finally used ss check ups. Making one of them zero or 1 will be meaningless.
Image Analyst
Image Analyst 2013 年 8 月 16 日
sisay, you don't have enough parameters to pin down both a1 and a2. That's what everyone is trying to tell you. You know the laws of logarithms don't you? So you can see that a1 and a2 are always go together in a pair "a1-a2" - there is no way to specify each, all you can do is to specify the difference "a1-a2". Why did my code below not convince you of that?
I have no idea what "that finally used ss check ups" means. But when Matt asked you if there were some other constraints that you weren't telling us, you said no. So in that case, all answerers are in agreement that a2 can be 0 or 1 or anything you want it to be because a1 will just adjust so that the difference is what it needs to be. Why can't you follow our arguments/explanations? Did you read my comments in my code where I proved that?
Walter Roberson
Walter Roberson 2013 年 8 月 16 日
Your equation is underdetermined. There are an infinite number of (a1, a2) pairs that will work in your equation; everything along the ray starting from a2 = epsilon (epsilon being positive and arbitrarily close to zero) and up, with only the difference calculatable.
Unless, that is, you have additional information that can be used to constrain the two values.
sisay
sisay 2013 年 8 月 16 日
Thank you guys for your helping me

サインインしてコメントする。

その他の回答 (2 件)

Walter Roberson
Walter Roberson 2013 年 8 月 16 日

0 投票

Any fixed degree that you use will result in a polynomial that tends to be infinitely wrong as x tends to infinity.

1 件のコメント

sisay
sisay 2013 年 8 月 16 日
Is there anyway of fitting this type of equation then? I find it difficult.

サインインしてコメントする。

Image Analyst
Image Analyst 2013 年 8 月 16 日

0 投票

sisay, try this:
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 = 24;
% Construct x.
x = linspace(.01, 40, 50);
a0 = 1;
a1 = 2;
a2 = 3;
% Create the perfect equation.
y = a0 + a1 * log(x)+ a2 * log(1./x);
subplot(3,1,1);
plot(x, y, 'b.-');
title('Noise-free signal', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Add some noise to make a noisy signal that we will fit.
yNoisy = y + 1.5 * rand(1, length(y));
subplot(3,1,2);
plot(x, yNoisy, 'b.-');
title('Noisy signal', 'FontSize', fontSize);
% Now get the fit
% y = a0 + a1 * log(x) - a2 * log(x)
% y = a0 + (a1 - a2) * log(x)
% y = (a1 - a2) * log(x) + a0
% Let newX = log(x), and (a1-a2) = coeffs(1), then
% y = coefficients(1) * newX + coefficients(2)
% so now we can use polyfit to fit a line.
newX = log(x);
coefficients = polyfit(newX, yNoisy, 1);
% Now get the fitted values
a0 = coefficients(2);
a1 = coefficients(1);
a2 = 0; % Might as well be 0 as any other value.
yFitted = a0 + a1 * log(x)+ a2 * log(1./x);
% and plot them
subplot(3,1,3);
plot(x, yNoisy, 'b.');
hold on;
plot(x, yFitted, 'r-', 'LineWidth', 3);
title('Fitted signal', 'FontSize', fontSize);
legend('Noisy data', 'Fitted signal');

カテゴリ

ヘルプ センター および File ExchangePolynomials についてさらに検索

質問済み:

2013 年 8 月 16 日

Community Treasure Hunt

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

Start Hunting!

Translated by