WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

koeffizientenvergleich

 

Jensen87
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2012, 18:10     Titel: koeffizientenvergleich
  Antworten mit Zitat      
Hallo Zusammen,

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?

Ich freu mich über jede Hilfe!

Grüße
Jens
Private Nachricht senden Benutzer-Profile anzeigen


EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 01.02.2012, 16:08     Titel:
  Antworten mit Zitat      
Hi,

wenn die Matlab-Funktion dies nicht hergibt muss die MatLab-Funktion neu geschrieben werden Smile
Die Formel habe ich aus der Mathworks-Referenz für den befehl conv() genommen.

Nachfolgend mein Code:

Code:

%% Cleanup
%
clear;
clc;

%% 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

w1 = zeros(p1,1);
w2 = zeros(p1,1);

% 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

w3 = zeros(p2,1);
w4 = zeros(p2,1);

% 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

w5 = zeros(p3,1);
w6 = zeros(p3,1);

% 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];

myM = length(myNumbers);
myN = length(mySymbols);
myP = myM+myN-1;

% 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
 


Erklärung:

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 Wink

Gruß,
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.