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

fsolve innerhalb einer Schleife funktioniert nicht

 

ben82
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2013, 18:40     Titel: fsolve innerhalb einer Schleife funktioniert nicht
  Antworten mit Zitat      
hallo,
ich habe ein problem mit fsolve innerhalb einer schleife. hier erstmal das programm:

Code:

load aaa.txt
K1=aaa(:,1);
K2=aaa(:,2);
K3=aaa(:,3);
load matrix_a.txt;
A=matrix_a;

for i=1:25
    function z=f(x);
        load aaa.txt
        K1=aaa(:,1);
        K2=aaa(:,2);
        K3=aaa(:,3);
        load matrix_a.txt;
        A=matrix_a;
        z=zeros(3,1);
        z(1)=-A(i,1)+K1(1,1)+K1(2,1).*x(1)+K1(3,1).*x(2)+K1(4,1).*x(3)+K1(5,1).*x(1).^2+K1(6,1).*x(2).^2+K1(7,1).*x(3).^2+K1(8,1).*x(1).*x(2)+K1(9,1).*x(1).*x(3)+K1(10,1).*x(2).*x(3)+K1(11,1).*x(1).^3+K1(12,1).*x(2).^3+K1(13,1).*x(3).^3+K1(14,1).*x(1).^2.*x(2)+K1(15,1).*x(1).^2.*x(3)+K1(16,1).*x(2).^2.*x(1)+K1(17,1).*x(2).^2*x(3)+K1(18,1).*x(3).^2.*x(1)+K1(19,1).*x(3).^2.*x(2)+K1(20,1).*x(1).*x(2).*x(3);
        z(2)=-A(i,2)+K2(1,1)+K2(2,1).*x(1)+K2(3,1).*x(2)+K2(4,1).*x(3)+K2(5,1).*x(1).^2+K2(6,1).*x(2).^2+K2(7,1).*x(3).^2+K2(8,1).*x(1).*x(2)+K2(9,1).*x(1).*x(3)+K2(10,1).*x(2).*x(3)+K2(11,1).*x(1).^3+K2(12,1).*x(2).^3+K2(13,1).*x(3).^3+K2(14,1).*x(1).^2.*x(2)+K2(15,1).*x(1).^2.*x(3)+K2(16,1).*x(2).^2.*x(1)+K2(17,1).*x(2).^2*x(3)+K2(18,1).*x(3).^2.*x(1)+K2(19,1).*x(3).^2.*x(2)+K2(20,1).*x(1).*x(2).*x(3);
        z(3)=-A(i,3)+K3(1,1)+K3(2,1).*x(1)+K3(3,1).*x(2)+K3(4,1).*x(3)+K3(5,1).*x(1).^2+K3(6,1).*x(2).^2+K3(7,1).*x(3).^2+K3(8,1).*x(1).*x(2)+K3(9,1).*x(1).*x(3)+K3(10,1).*x(2).*x(3)+K3(11,1).*x(1).^3+K3(12,1).*x(2).^3+K3(13,1).*x(3).^3+K3(14,1).*x(1).^2.*x(2)+K3(15,1).*x(1).^2.*x(3)+K3(16,1).*x(2).^2.*x(1)+K3(17,1).*x(2).^2*x(3)+K3(18,1).*x(3).^2.*x(1)+K3(19,1).*x(3).^2.*x(2)+K3(20,1).*x(1).*x(2).*x(3);
       
    endfunction;
    C(i,:)=fsolve("f", [-1.12,-1.34,0.8])

end
 


es erscheint folgende Fehlermeldung:
"error: attempted to use a complex scalar as an index
(forgot to initialize i or j?)"

Probleme macht das A(i,1) in der Funktion, offenbar kennt er das i dort nicht. Wie kann ich das elegant lösen? Die fsolve function ohne schleife funktioniert. Was mich außerdem stört ist, dass man die variablen in der funktion und außerhalb definieren muss damit es klappt? geht das auch anders?

für hilfe wäre ich dankbar. Hab das jetzt mit Octave gemacht. aber ich denke es ist ein Programmierproblem

gruß
Ben
Private Nachricht senden Benutzer-Profile anzeigen


markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 21.06.2013, 11:49     Titel: Re: fsolve innerhalb einer Schleife funktioniert nicht
  Antworten mit Zitat      
Mal peau a peau ...
ben82 hat Folgendes geschrieben:

Was mich außerdem stört ist, dass man die variablen in der funktion und außerhalb definieren muss damit es klappt? geht das auch anders?


Die Funktion kann nur mit den Werten arbeiten/rechnen, die du ihr zur Verfügung stellst! Du musst also deine Funktion erweitern und nicht bloß x an diese übergeben, sondern alle Werte mit denen du in der Funktion rechnen möchtest.
Also function z=f(x, K1 , K2 , K3, A);
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
ben82
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2013, 13:53     Titel:
  Antworten mit Zitat      
hallo markuman,
danke erstmal für deine Antwort.
habe es probiert mit z=f(x,i,K1,K2,K3,A)und dann innerhalb der function die variablen gelöscht. Aber das macht er leider nicht.

error: 'A' undefined near line 12 column 15

kann es sein das man nur 1 variable übergeben kann?
das wäre schlecht, weil für die Schleife müsste ich mindestens noch das "i" an die function übergeben. Das ich K1,K2 usw nochmal initialisieren müsste, damit könnte ich notfalls noch leben.

aber die Schleife brauche ich zwingend.

Vielleicht hat noch jemand eine idee

gruß
Ben
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 21.06.2013, 14:01     Titel:
  Antworten mit Zitat      
Klar kann man mehr als eine Variable übergeben!

Code:

function [eins, zwei]=totalsinnfrei(a,i,b)

eins=a*i;
zwei=b+i^i;

end

>> a=rand(3,3)

a =

         0.964888535199277         0.957166948242946         0.141886338627215
         0.157613081677548         0.485375648722841         0.421761282626275
         0.970592781760616           0.8002804688888         0.915735525189067

>> i=2

i =

     2

>> b=5

b =

     5

>> [eins,zwei]=totalsinnfrei(a,i,b)

eins =

          1.92977707039855          1.91433389648589         0.283772677254431
         0.315226163355097         0.970751297445682          0.84352256525255
          1.94118556352123           1.6005609377776          1.83147105037813


zwei =

     9

>>
 

_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
ben82
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2013, 15:17     Titel:
  Antworten mit Zitat      
ok...
dann kann man meine theorie schon mal ausschliessen.

habe das "i" noch zusätzlich eingebaut:

Code:

load aaa.txt
K1=aaa(:,1);
K2=aaa(:,2);
K3=aaa(:,3);
load matrix_a.txt;
A=matrix_a;

for i=1:25
    function z=f(x,i)
        i
        load aaa.txt;
        K1=aaa(:,1);
        K2=aaa(:,2);
        K3=aaa(:,3);
        load matrix_a.txt;
        A=matrix_a;
        z=zeros(3,1);
        z(1)=-A(i,1)+K1(1,1)+K1(2,1).*x(1)+K1(3,1).*x(2)+K1(4,1).*x(3)+K1(5,1).*x(1).^2+K1(6,1).*x(2).^2+K1(7,1).*x(3).^2+K1(8,1).*x(1).*x(2)+K1(9,1).*x(1).*x(3)+K1(10,1).*x(2).*x(3)+K1(11,1).*x(1).^3+K1(12,1).*x(2).^3+K1(13,1).*x(3).^3+K1(14,1).*x(1).^2.*x(2)+K1(15,1).*x(1).^2.*x(3)+K1(16,1).*x(2).^2.*x(1)+K1(17,1).*x(2).^2*x(3)+K1(18,1).*x(3).^2.*x(1)+K1(19,1).*x(3).^2.*x(2)+K1(20,1).*x(1).*x(2).*x(3);
        z(2)=-A(i,2)+K2(1,1)+K2(2,1).*x(1)+K2(3,1).*x(2)+K2(4,1).*x(3)+K2(5,1).*x(1).^2+K2(6,1).*x(2).^2+K2(7,1).*x(3).^2+K2(8,1).*x(1).*x(2)+K2(9,1).*x(1).*x(3)+K2(10,1).*x(2).*x(3)+K2(11,1).*x(1).^3+K2(12,1).*x(2).^3+K2(13,1).*x(3).^3+K2(14,1).*x(1).^2.*x(2)+K2(15,1).*x(1).^2.*x(3)+K2(16,1).*x(2).^2.*x(1)+K2(17,1).*x(2).^2*x(3)+K2(18,1).*x(3).^2.*x(1)+K2(19,1).*x(3).^2.*x(2)+K2(20,1).*x(1).*x(2).*x(3);
        z(3)=-A(i,3)+K3(1,1)+K3(2,1).*x(1)+K3(3,1).*x(2)+K3(4,1).*x(3)+K3(5,1).*x(1).^2+K3(6,1).*x(2).^2+K3(7,1).*x(3).^2+K3(8,1).*x(1).*x(2)+K3(9,1).*x(1).*x(3)+K3(10,1).*x(2).*x(3)+K3(11,1).*x(1).^3+K3(12,1).*x(2).^3+K3(13,1).*x(3).^3+K3(14,1).*x(1).^2.*x(2)+K3(15,1).*x(1).^2.*x(3)+K3(16,1).*x(2).^2.*x(1)+K3(17,1).*x(2).^2*x(3)+K3(18,1).*x(3).^2.*x(1)+K3(19,1).*x(3).^2.*x(2)+K3(20,1).*x(1).*x(2).*x(3);
       
    endfunction;
    C(i,:)=fsolve("f", [-1.12,-1.34,0.8])

end
 


habe mir mal das i anzeigen lassen für jeden Schleifendurchlauf (das A(i,1) hab ich, damit überhaut gerechnet wird, durch A(1,1) ersetzt).

das i macht er irgendwie komplet i=0+1i , und bleibt auch konstant.
(auch für andere Buchstaben)

da wird das problem sein, weil er damit als index für die Matrix A nichts anfangen kann. Aber warum macht das Programm das so?
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 21.06.2013, 15:48     Titel:
  Antworten mit Zitat      
Du läds ja immer noch den ganzen krämpel in der Funktion?
Naja, i ist ja auch eine Zahl, und keine Variable. Wird nur leider dauernd als Schleifen Variable benutzt - funktioniert aber trotzdem - aber wär das selbe Verbrechen wenn man for pi = 23:42 macht.

Code:


function ja=totalsinnfrei(k)
k
end

% testit.m
for i = 1:10
    totalsinnfrei(i)
end


>> testit

k =

     1


k =

     2


k =

     3


k =

     4


k =

     5


k =

     6


k =

     7


k =

     8


k =

     9


k =

    10



 


Ich glaube auch dass du fsolve falsch verwendest. Es könnte so funktionieren (ist so aber glaub ich auch falsch. Also am besten noch mal die Dokumentation von fsolve angucken (ja, bei Matlab, die Octave Doku ist turbo grottig!)), da ich jedoch nicht deine txt Dateien habe, ist das auch eher als pseudocode zu verstehen.

Code:

% meinefunktion.m
  function z=meinefunktion(x,K1,K2,K3,A)
   
        z(1)=-A(1,1)+K1(1,1)+K1(2,1).*x(1)+K1(3,1).*x(2)+K1(4,1).*x(3)+K1(5,1).*x(1).^2+K1(6,1).*x(2).^2+K1(7,1).*x(3).^2+K1(8,1).*x(1).*x(2)+K1(9,1).*x(1).*x(3)+K1(10,1).*x(2).*x(3)+K1(11,1).*x(1).^3+K1(12,1).*x(2).^3+K1(13,1).*x(3).^3+K1(14,1).*x(1).^2.*x(2)+K1(15,1).*x(1).^2.*x(3)+K1(16,1).*x(2).^2.*x(1)+K1(17,1).*x(2).^2*x(3)+K1(18,1).*x(3).^2.*x(1)+K1(19,1).*x(3).^2.*x(2)+K1(20,1).*x(1).*x(2).*x(3);
        z(2)=-A(1,2)+K2(1,1)+K2(2,1).*x(1)+K2(3,1).*x(2)+K2(4,1).*x(3)+K2(5,1).*x(1).^2+K2(6,1).*x(2).^2+K2(7,1).*x(3).^2+K2(8,1).*x(1).*x(2)+K2(9,1).*x(1).*x(3)+K2(10,1).*x(2).*x(3)+K2(11,1).*x(1).^3+K2(12,1).*x(2).^3+K2(13,1).*x(3).^3+K2(14,1).*x(1).^2.*x(2)+K2(15,1).*x(1).^2.*x(3)+K2(16,1).*x(2).^2.*x(1)+K2(17,1).*x(2).^2*x(3)+K2(18,1).*x(3).^2.*x(1)+K2(19,1).*x(3).^2.*x(2)+K2(20,1).*x(1).*x(2).*x(3);
        z(3)=-A(1,3)+K3(1,1)+K3(2,1).*x(1)+K3(3,1).*x(2)+K3(4,1).*x(3)+K3(5,1).*x(1).^2+K3(6,1).*x(2).^2+K3(7,1).*x(3).^2+K3(8,1).*x(1).*x(2)+K3(9,1).*x(1).*x(3)+K3(10,1).*x(2).*x(3)+K3(11,1).*x(1).^3+K3(12,1).*x(2).^3+K3(13,1).*x(3).^3+K3(14,1).*x(1).^2.*x(2)+K3(15,1).*x(1).^2.*x(3)+K3(16,1).*x(2).^2.*x(1)+K3(17,1).*x(2).^2*x(3)+K3(18,1).*x(3).^2.*x(1)+K3(19,1).*x(3).^2.*x(2)+K3(20,1).*x(1).*x(2).*x(3);
       
    endfunction;


% MeinScript.m
load aaa.txt
load matrix_a.txt;

K1=aaa(:,1);
K2=aaa(:,2);
K3=aaa(:,3);
A=matrix_a;

for i=1:25
 
    C(i,:)=fsolve(@meinefunktion, [-1.12,-1.34,0.8],K1,K2,K3,A(i,:))

end
 

_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
ben82
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2013, 18:23     Titel:
  Antworten mit Zitat      
ich hab den krämpel immer noch reingeladen, weil ich bei dieser function immer die Fehlermeldung bekomme "A" undefined.... wenn ich die rauslösche.

dein erstes Beispiel wo du mehrere variablen einlädst, funktioniert bei mir auch.
aber leider nicht in meinem programm.

Hast wohl recht. Ich muss mich nochmal intensiv einlesen ins FSOLVE.
Wie gesagt... es wundert mich nur, dass es ohne Schleife geht und ich es mit Schleife garnicht zum laufen bekomme.

Danke trotzdem für die Hilfe
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 - 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.