ich benötige Hilfe bei einem Koeffizientenvergleich, den ich in Matlab durchführen möchte/muss.
Ich habe drei Polynome:
- Das Polynom p1, als Vektor mit Zahlenwerten
- Das Polynom p2, als Vektor mit Zahlenwerten
- und letzlich das Polynom p3, das keine festen Zahlenwerte enthält, sondern unbekannte Variablen.
Der Koeffizientenvergleich soll zwischen p1 und dem Produkt aus p2 und p3 gemacht werden. Hier entsteht auch mein Problem. Eine Polynommultiplikation würde ich normalerweise mit conv(x) machen. Das geht leider nicht, da in p3 variablen stehn, die ich momentan mit a=sym('a') festgelegt habe.
Weiß jemand von euch, wie, bzw. ob ich p2 und p3 multiplizieren kann, sodass ein vektor mit den koeffizienten des Produkts entsteht, der neben zahlen auch unbekannte variablen enthält?
wenn die Matlab-Funktion dies nicht hergibt muss die MatLab-Funktion neu geschrieben werden
Die Formel habe ich aus der Mathworks-Referenz für den befehl conv() genommen.
%% Example 1 - m = n
%
vec1 = [1, 2, 3];
vec2 = [7, 8, 9];
%% Calculate Convolution for Example 1
%
m1 = length(vec1);
n1 = length(vec2);
p1 = m1+n1-1;
% Check if first vector is longer (has to be!) if m1 < n1
% switch vectors
vecTemp = vec1;
vec1 = vec2;
vec2 = vecTemp;
clear vecTemp;
% switch m and n
mTemp = m2;
m2 = n2;
n2 = mTemp;
clear mTemp;
end
% myConvolution for k = 1:p1
for j = max(1,k+1-n1):min(k,m1) if k == j
w1(k) = w1(k) + vec1(j)*vec2(1);
else
w1(k) = w1(k) + vec1(j)*vec2(k+1-j);
end end end
% compare with MatLab-Function
w2 = conv(vec1,vec2);
%% Example 2 - m > n
%
vec3 = [1, 2, 3, 4, 5];
vec4 = [7, 8, 9];
%% Calculate Convolution for Example 2
%
m2 = length(vec3);
n2 = length(vec4);
p2 = m2+n2-1;
% Check if first vector is longer (has to be!) if m2 < n2
% switch vectors
vecTemp = vec3;
vec3 = vec4;
vec4 = vecTemp;
clear vecTemp;
% switch m and n
mTemp = m2;
m2 = n2;
n2 = mTemp;
clear mTemp;
end
% myConvolution for k = 1:p2
for j = max(1,k+1-n2):min(k,m2) if k == j
w3(k) = w3(k) + vec3(j)*vec4(1);
else
w3(k) = w3(k) + vec3(j)*vec4(k+1-j);
end end end
% compare with MatLab-Function
w4 = conv(vec3,vec4);
%% Example 3 - m < n
%
vec5 = [1, 2, 3];
vec6 = [7, 8, 9, 0, 2];
%% Calculate Convolution for Example 3
%
m3 = length(vec5);
n3 = length(vec6);
p3 = m3+n3-1;
% Check if first vector is longer (has to be!) if m3 < n3
% switch vectors
vecTemp = vec5;
vec5 = vec6;
vec6 = vecTemp;
clear vecTemp;
% switch m and n
mTemp = m3;
m3 = n3;
n3 = mTemp;
clear mTemp;
end
% myConvolution for k = 1:p3
for j = max(1,k+1-n3):min(k,m3) if k == j
w5(k) = w5(k) + vec5(j)*vec6(1);
else
w5(k) = w5(k) + vec5(j)*vec6(k+1-j);
end end end
% compare with MatLab-Function
w6 = conv(vec5,vec6);
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Finally with symbols %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
syms a b c d e f;
myNumbers = [1, 2, 3, 4];
mySymbols = [a, b, c, d, e, f];
% Check if first vector is longer (has to be!) if myM < myN
% switch vectors
vecTemp = myNumbers;
myNumbers = mySymbols;
mySymbols = vecTemp;
clear vecTemp;
% switch m and n
mTemp = myM;
myM = myN;
myN = mTemp;
clear mTemp;
end
% ugly "hack" - we need a empty vector (=all entries zeros) of length myP % but it has to be symbolic; with zeros(myP, 1) we only can create a double
myConvoluted = a * eye(myP,1) - a * eye(myP,1);
% myConvolution for k = 1:myP
for j = max(1,k+1-myN):min(k,myM) if k == j
myConvoluted(k) = myConvoluted(k) + myNumbers(j)*mySymbols(1);
else
myConvoluted(k) = myConvoluted(k) + myNumbers(j)*mySymbols(k+1-j);
end end end
Am Anfang sind 3 Beispiele für die Fälle, dass
1. die Vektoren gleich lang sind
2. der erste Vektor länger als der zweite Vektor ist
3. deer erste vektor kürzer als der zweite vektor ist.
Bei 1 ist die Berechnung einfach. Bei 2 auch. Bei 3 müssen die beiden vektoren vertauscht werden. Abschließend wird jedesmal mit den Zahlenbeispielen auch noch der MatLab-interne conv()-befehl aufgerufen, damit man sehen kann, dass die Ergebnisse identisch sind und mein Code damit stimmt.
Ganz am Ende das ganze mit einem Zahlenvektor und einem Symbolic-Vektor. Das Ergebnis steht in "myConvoluted". Funktion mit R2008b getestet und hiermit bestätigt, trotzem keine Garantie
Gruß,
_________________
- EliteTUM
_____________________________________
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.