Tutorial:JMathLab/8 Polynomials
Polynomials
One can handle polynomials with symbolic variables. In this chapter, however, we work with the Octave approach of using vectors as list of polynomial coefficients: A polynomial of degree n is represented by a vector having n+1 elements, the element with index 1 being the coefficient of the highest exponent in the polynomial. With poly(x) a normal polynomial is created, whose zeros are the elements of x, polyval(a,x) returns function values of the polynomial with coefficients a in the point x, roots(a) calculates the zeros, and polyfit(x,y,n) calculates the coefficients of the polynomial of degree $n$, whose graph passes through the points x and y. If their number is larger than n+1 a least square estimate is performed. The regression analysis in exercise 8 was performed using this method.
The roots of a 4th-degree polynomial are -4,-2,2,4 and it intersects the y-axis at (y=-64). Calculate its coefficients:
<jc lang="math"> a=poly([-4, -2, 2, 4]); printf('%f',a) b=polyval(a,1) a=-64/polyval(a,0) * a; printf('%f',a) a = polyfit([-4 -2 2 4 0],[0 0 0 0 -64],4) </jc>
One can use alternative engine requiring symbolic calculations:
<jc lang="math"> a=poly([-4,-2,2,4]); printf('%f\n',a) a = -64/polyval(a,0) * a; printf('%f\n',a) a = polyfit([-4,-2,2,4,0],[0,0,0,0,-64],4) </jc>
Example 2: On a grid with $x,y$-Coordinates we have the following grey values of a digital image:
y\x 1 2 3 4 1 98 110 122 136 2 91 112 131 141 3 73 118 145 190 4 43 129 170 230
Which grey value do you expect at position $x=2,35; y=2,74$? Calculate the bi-cubic interpolation.
Solution: <jc lang="math"> Z=[98,110,122,136;
91,112,131,141; 73,118,145,190; 43,129,170,230];
i=1; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); i=2; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); i=3; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); i=4; p=polyfit(1:4,Z(i,:),3); z(i)=polyval(p,2.35); p=polyfit(1:4,z,3) printf('p=%f\n',p) zp=polyval(p,2.74) printf('zp=%f',zp) </jc>
Polynomial functions. Summary table
No access to this part. Use Member area to request membership. If you are already a member, login to Member area and come back to this wiki. |
We have learnt that polynomials may be represented by the vector of their coefficient. Using a symbolic variable x we will now create a symbolic polynomial p. Conversely, we can extract the coefficients from a symbolic polynomial using the function coeff(p, x, exponent). The command allroots(p) returns the zeros.
<jc lang="math"> a=[3 2 5 7 4]; % coefficients syms x y=polyval(a,x) % symbolic polynomial ans=coeff(y,x,3) % get one coefficient b=coeff(y,x,4:-1:0) % or all at once printf('%f\n',b) ans=allroots(y) % same as roots(a) printf('%f\n',ans) </jc>
Up to this point there is little advantage of using symbolic calculations, it is just another way of specifying a problem. The main benefit of symbolic calculations emerges when we are dealing with more than one symbolic variable, or, meaning essentially the same, when our polynomial has non-constant coefficients. This case can be treated efficiently only with symbolic variables. Notice in the example below how the polynomial y is automatically multiplied through, and brought into a canonical form. In this form the symbolic variables are sorted alphabetically, i.e. z is main variable compared to x. The coefficients can be calculated for each variable separately.
<jc lang="math"> syms x,z y=(x-3)*(x-1)*(z-2)*(z+1); printf('%f\n',y) ans=coeff(y,x,2); printf('%f\n',ans) ans=coeff(y,z,2); printf('%f',ans) </jc>
Roots
The command allroots functions with variable coefficients also, but only, if the polynomials degree in the main variable is smaller than 3, or it is biquadratic. If roots of other variables x are searched, one should use the more general solve(p,x), which will be discussed in more detail later.
<jc lang="math"> syms x,z y = x*z^2-3*x*z+(2*x+1); ans=allroots(y); printf('All roots=%f\n',ans) ans=solve(y,x); printf('Solves=%f',ans) </jc>
Squarefree Decomposition
The decomposition of p in linear, quadratic, cubic etc factors is accomplished by sqfr(p). Returned is a vector of factors sorted in ascending order of the exponents.
<jc lang="math"> syms x y=(x-1)^3*(x-2)^2*(x-3)*(x-4); printf('Input=%f\n',y) z=sqfr(y); printf('sqfr=%f\n',z) </jc>
Division and Common Denominator
The division of two polynomials p and q in one polynomial and remainder is calculated using divide(p,q). If the polynomials have more than one variable, an optional variable can be specified, which will be used for division. gcd(p,q) returns the greatest common denominator of two expressions. Both functions also work with numbers as arguments.
<jc lang="math"> ans=divide(122344,7623); printf('ans=%f',ans) </jc>
<jc lang="math"> ans=divide(2+i,3+2*i); printf('ans=%f\n',ans) </jc>
<jc lang="math"> syms x,z ans=divide(x^3*z-1,x*z-x,x); printf('ans=%f\n',ans) ans=divide(x^3*z-1,x*z-x,z); printf('ans=%f',ans) </jc>
<jc lang="math"> syms x,z ans=gcd(32897397,24552502); printf('ans=%f\n',ans) ans=gcd(z*x^5-z,x^2-2*x+1); printf('ans=%f',ans) </jc>
Real- and Imaginary Part
realpart(expression) and imagpart(expression) is used to decompose complex expressions. Symbolic variables in these expressions are assumed to be real-valued.
<jc lang="math"> syms x y=(3+i*x)/(2-i*x); printf('Input=%f\n',y) ans=realpart(y); printf('Real=%f\n',ans) ans=imagpart(y); printf('Imag=%f',ans) </jc>