<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hello Frederico,<br>
</p>
<div class="moz-cite-prefix">Le 02/04/2020 à 10:27, Federico Miyara
a écrit :<br>
</div>
<blockquote type="cite"
cite="mid:208747ef-5ed7-4d7f-3883-391c60c2a804@fceia.unr.edu.ar">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<br>
<font face="Courier New">Dear All,<br>
<br>
Trying to convert an old Matlab script to Scilab I miss the
function polyfit, which computes the coefficients of a
polynomial that fits x-y data using the least square method.<br>
<br>
I found the following thread <a moz-do-not-send="true"
href="https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/mailinglists.scilab.org/Polynomic-regression-td4030799.html">http://mailinglists.scilab.org/Polynomic-regression-td4030799.html</a>
explaining that one can use the backslash, for instance for a
3rd degree polynomial, where x and y are column vectors:<br>
<br>
X = [</font><font face="Courier New">ones(x), </font><font
face="Courier New">x, </font><font face="Courier New">x.^2, </font><font
face="Courier New"> </font><font face="Courier New"> </font><font
face="Courier New">x.^3</font><font face="Courier New">]<br>
A = X\y; <br>
<br>
(I changed the order of powers to get the coefficients ready for
horner)<br>
<br>
I implemented a polyfit function using the basic theory of
polynomial regression and I find it is faster </font><font
face="Courier New">by a factor of 1.5-2 </font><font
face="Courier New">than the previously mentioned method.<br>
</font></blockquote>
<p><font face="Courier New">Yeah, but really badly conditionned
compared to the above method which is based on orthogonal
tranformations (X=Q*R factorization). With your below method you
solve a linear system with X'*X matrix which has a condition
number which is the square of the condition number of the R
matrix issued from the Q*R factorization of X.</font></p>
<p><font face="Courier New">S.<br>
</font></p>
<blockquote type="cite"
cite="mid:208747ef-5ed7-4d7f-3883-391c60c2a804@fceia.unr.edu.ar"><font
face="Courier New"> <br>
The basic algorithm I use is (n = desired degree):<br>
<br>
// Initialize matrix X<br>
X = ones(length(x), n+1);<br>
// Compute Vandermonde's matrix<br>
for k =2:n+1<br>
X(:,k) = X(:,k-1).*x;<br>
end<br>
// Apply the Moore-Penrose pseudoinverse matrix and<br>
// multiply by the dependent data vector to get the<br>
// least squares approximation of the polynomial<br>
// coefficients<br>
A = inv(X'*X)*X'*y;<br>
<br>
I've seen some discussion regarding the need for a polyfit
function in Scilab. The main argument against such a function is
that it is unnecessary since it is a particular case of the
backslash division. This is true, but the above example shows
that users' implementations are not always optimized, and as it
is such a frequent problem, it would be nice to have a native
polyfit (or whatever it may be called) function. <br>
<br>
Regards,<br>
<br>
Federico Miyara<br>
</font> <br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:users@lists.scilab.org">users@lists.scilab.org</a>
<a class="moz-txt-link-freetext" href="https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users">https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users</a>
</pre>
</blockquote>
<pre class="moz-signature" cols="72">--
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
<a class="moz-txt-link-freetext" href="http://www.utc.fr/~mottelet">http://www.utc.fr/~mottelet</a>
</pre>
</body>
</html>