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

Gibt's was schnelleres als x=A\b?

 

Gast Ritis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2010, 11:19     Titel: Gibt's was schnelleres als x=A\b?
  Antworten mit Zitat      
Hallo zusammen,

ich bastle gerade an einem Code, in dem massiv (ca. 800.000 Mal) das Gleichungssystem
A*x = b gelöst werden muss. Das klappt auch soweit ganz gut, jedoch dauerts relativ lange (kein Wunder bei 800.000 Aufrufen).
Nun stellt sich für mich die Frage, ob es evtl. schnellere Möglichkeiten der Lösung gibt, z.B. über mex Funktionen oder so.
Das Gleichungssystem selbst ist relativ klein. Zur Zeit sinds 3 Unbekannte, wobei das in Zukunft auf 5 oder 6 anwachsen kann.

Habt Ihr noch einen Tipp?

Viele Grüße
Andi


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2010, 13:27     Titel:
  Antworten mit Zitat      
Hallo,

ich denke es geht sehr viel schneller wenn man nicht 800.000 mal das gleiche macht, sondern das Gleichungssystem analytisch löst.

viele Grüße
Thomas

Code:

sol = solve('a11*x1 + a12*x2 + a13*x3 = data1','a11*x1 + a12*x2 + a13*x3 = data1','a11*x1 + a12*x2 + a13*x3 = data1','x1,x2,x3');
subs(sol.x1,'a11',[randn(1,10)])
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.09.2010, 13:58     Titel:
  Antworten mit Zitat      
Hallo,

die Frage dürfte sein:
- Welche Dimensionen haben A, b?
- Sind es öfter mal ähnliche A?
- Was soll mit den Resultaten gemacht werden?

Grundsätzlich ist der \-Algorithmus schon stark optimiert.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast Ritis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2010, 13:59     Titel:
  Antworten mit Zitat      
Ja stimmt. Analytisch wäre auch am Besten.

Das Gleichungssystem wird verwendet um die Diffusion verschiedener Stoffgemische zu bestimmen. Nun soll das Programm für verschieden zusammengesetzte Stoffgemische funktionieren. Daher würde ich ungern eine analytische Lösung für ein 3-Stoffsystem hard codieren, da dann alles andere nicht mehr funktioniert.
Ich hätte gedacht, dass es evtl. einen schnellen numerischen Löser für kleine Systeme gibt. Klein deshalb, weil ich davon ausgehen kann, dass die Stoffanzahl fünf oder sechs nicht überschreiten wird.

Viele Grüße
Andi
 
Gast Ritis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2010, 14:38     Titel:
  Antworten mit Zitat      
Ich habe mir schon gedacht, dass x= A\b schon ordentlich optimiert ist. Wenn man sich die Hilfe dazu ansieht,dann ist da schon an einiges gedacht worden ...

Das System ist quadratisch und soweit ich weiß voll besetzt. Ich bin mir nicht sicher ob's auch noch symmetrisch ist. Muss ich mal schauen.

Die Größen also A=3x3; b = [3x1]; x = [3x1] oder entsprechend größer (je nach Anzahl der betrachteten Spezies). Sicherlich maximal A=6x6; b = [6x1] und x=[6x1];

Alles andere wird schwierig...

Simulationshintergrund: Beschreibung der Diffusion in porösen Medien durch ein angepassten Maxwell-Stefan Modell.

Viele Grüße
Andi
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2010, 07:11     Titel:
  Antworten mit Zitat      
Ich habs jetzt mal ausprobiert. Zur Lösung von 8e5 Gleichungsystemen braucht mein PC etwa 11s mit der backslash Methode und 0.4s mit der symbolischen Lösung.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast Ritis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2010, 14:49     Titel:
  Antworten mit Zitat      
Hi,

ich habe mir die Mühe gemacht, ohne Symbolic TB, das Gleichungssystem für ein 3x3 System analytisch zu lösen und ein entsprechendes Script zu schreiben. Die Symbolic TB möchte ich nicht dauerhaft im Code verankern, da dies die Nutzbarkeit einschränkt. (Bei mir in der Firma hat nicht jeder diese TB).
Das klappt auch hervorragend und schnell. Hier das Script
Code:

function x = analytical_solution(a,b)
%solves linear system ax=b
% a = Matrix size [3x3]
% b = vector size [3x1]
% x = vector size [1x3]

% preallocation
x = zeros(1,3);

% Calculation of each factor
f1 =     b(3)/a(3,3);
f2 =  -a(3,1)/a(3,3);
f3 =  -a(3,2)/a(3,3);
f4 =    (b(2)-a(2,3)*f1)/(a(2,2)+a(2,3)*f3);
f5 = -(a(2,1)+a(2,3)*f2)/(a(2,2)+a(2,3)*f3);
f6 = f1+f3*f4;
f7 = f2+f3*f5;

% solution
x(1,1) = (b(1)-a(1,2)*f4-a(1,3)*f6)/(a(1,1)+a(1,2)*f5+a(1,3)*f7);
x(1,2) = f4+f5*x(1);
x(1,3) = f1+f2*x(1)+f3*x(2);
 


Ich dachte nun, dass ich das Ding einfach per c-mex File einbinden kann und dann NOCH mehr Speed rauszuholen.
Code:

//You can include any C libraries that you normally use
#include "math.h"
#include "mex.h"   //--This one is required

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    //All code and internal function calls go in here!
    //---Inside mexFunction---

    //Declarations
    // Pointer to Input Arrays
    mxArray *xData, *yData;
    // a - Matrix a[3x3]
    // b - Vector b[3,1]
    // x - Vector c[1,3]
    double *a, *b, *x;

    // local variables
    double f1,f2,f3,f4,f5,f6,f7;

    //Copy input pointer x
    xData = prhs[0];
    yData = prhs[1];

    //Get matrix x
    a = mxGetPr(xData);
    b = mxGetPr(yData);

    // define output vector [1x3]
    plhs[0] = mxCreateDoubleMatrix(1, 3, mxREAL); //mxReal is our data-type

    //Get a pointer to the data space in our newly allocated memory
    x= mxGetPr(plhs[0]);

    // Calculation of each factor
    f1 =   -a[2]/a[8];
    f2 =   -a[5]/a[8];
    f3 =    b[2]/a[8];
    f4 =    (b[1]-a[7]*f3)/(a[4]+a[7]*f2);
    f5 =   -(a[1]+a[7]*f1)/(a[4]+a[7]*f2);
    f6 = f3+f2*f4;
    f7 = f1+f2*f5;

    // estimate solution
    x[0] = (b[0]-a[3]*f4-a[6]*f6)/(a[0]+a[3]*f5+a[6]*f7);
    x[1] = f4+f5*x[0];
    x[2] = f3+f1*x[0]+f2*x[1];

}
 


Der Witz ist nun aber, dass das mex -File langsamer (nicht dramatisch, aber signifikant) ist... Versteh ich nicht....
Habt Ihr einen Tipp?

Andi
 
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 - 2025 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.