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

if abs(a - xi) < acc -> Fehlermeldung

 

VMH
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 17.10.10
Wohnort: Frankenwald
Version: 4.1.2, 5.3.0
     Beitrag Verfasst am: 17.10.2010, 14:04     Titel: if abs(a - xi) < acc -> Fehlermeldung
  Antworten mit Zitat      
Hallo *!

Untenstehender Quelltext berechnet für 0<= a <= 1 iterativ eine Näherungslösung. Das Programm läuft auf einer SPS in SCL problemlos, aber in SciLab bereitet es mir Kopfzerbrechen: für 0<a<~0.8 bricht die Ausführung nach einigen Iterationen innerhalb der WHILE-Schleife beim Eintritt in's IF mit Fehlermeldung ab. Breakpoint auf den If-Eintritt ergibt, dass a, xi und acc reell sind und sinnvolle Werte enthalten.

Was mache ich falsch?

TIA, Volker

Quelltext:
Code:

// Steuerwinkel aus Spannungsverhältnis bestimmen
function x = sw(a)
  // Definitionen
  acc = 0.001;                       // Genauigkeit
  ae  = 0;                           // aktueller Fehler
  ai  = %pi / 2;                     // aktueller Steuerwinkel
  aa  = %pi / 2;                     // letzter   Steuerwinkel
  da  = 0;                           // Inkrement Steuerwinkel
  xi  = 0.5;                         // berechnetes Leistungsverhältnis
 
  // Aufteilung bei halber Spannung
  if (a < 0.5)
      da = +0.1 * %pi;
  elseif(a >= 0.5)
      da = -0.1 * %pi;
  end
  if (a < 0.5)
      da = +0.1 * %pi;
  elseif(a >= 0.5)
      da = -0.1 * %pi;
  end
   
  // Iterative Steuerwinkel-Bestimmung
  while da != 0
    if abs(a - xi) < acc // Punktlandung //---HIER FEHLER NACH EINIGEN ITERATIONEN---
      aa = ai;
      da = 0;
    elseif( (a < 0.5 & xi < a) | (a >= 0.5 & xi > a) )
      ai = aa;
      da = da / 2;
      ai = ai + da;
   else
      if( (a < 0.5 & xi > a) | (a >= 0.5 & xi < a) )
        aa = ai;
      end
      ai = ai + da;
    end
   
    xi = sqrt( 1 / %pi * (%pi - ai + sin(2 * ai) / 2) );
    printf('%f    %f\n', ai, xi);
  end
   
    x = ai;
endfunction

sw(0.07)

//Ergibt Fehlermeldung
!--error 144
Undefined operation for the given operands
  check or define function %s_1_s for overloading
at line      30 of function sw called by :
line   112 of function db_wrapper_2_db called by :
setbpt("db_wrapper_2_db",6); setbpt("sw",29);; db_wrapper_2_db();
while executing a callback
 
Private Nachricht senden Benutzer-Profile anzeigen


aj.geissler
Forum-Guru

Forum-Guru



Beiträge: 251
Anmeldedatum: 26.11.07
Wohnort: Seeheim-Jugenheim
Version: ---
     Beitrag Verfasst am: 20.10.2010, 12:00     Titel:
  Antworten mit Zitat      
Hi,

bei Ausführung von

"%pi * (%pi - ai + sin(2 * ai) / 2);"

entstehen bei sw(0.07) irgendwann negative Werte, die nach der Wurzelbildung zu komplexen Zahlen führen.

SciLab reagiert dann beim Vergleich einer komplexen Zahl mit der von Dir beobachteten Fehlermeldung.

Wenn man z.B.

1+%i > 0.5

eintippt, erhält man als Fehlermeldung
!--error 144
Undefined operation for the given operands
check or define function %s_2_s for overloading

Deshalb die Berechnung des Wurzelarguments für negative Argumente (oder 1/0) vorher abfangen.

Grüße
Andreas
_________________

Andreas Geißler
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.