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

allg. Problem beim function schreiben

 

redjat
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 02.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 18:34     Titel: allg. Problem beim function schreiben
  Antworten mit Zitat      
hallo,
ich will folgende function schreiben:

function [PopulationComp] = projection(x0,t)

x0=input('vector with start population(x0)');
t=input('time period: ');
....
....


Error: Function definitions are not permitted in this context.

Ich will x0 und t quasi als input eingeben aufgrund der eingegebenen werte die funktion durchlaufen lassen.

wenn ich das ganze ohne funktionszeile durchlaufen lasse, funktioniert es auch. was könnte an dieser definition der funktion falsch sein?
hat jemand eine allgemeine idee ohne den quellcode sehen zu müssen, könnte ihn natürlich auch posten aber die zwei werte im input kommen auch wirklich in dem funktionsquellcode vor.

vielen dank für ideen, hab noch keine erfahrung mit solchen funktionen deswegen bitte auch die naheligendsten hinweise posten ^^
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 02.02.2012, 20:16     Titel:
  Antworten mit Zitat      
Möglicherweise hast du die Sachen in einem Skript-File (= alle .m-Dateien die NICHT mit "function" anfangen!) ?!?
Private Nachricht senden Benutzer-Profile anzeigen
 
redjat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 02.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 20:45     Titel:
  Antworten mit Zitat      
x0 und t wurden in einem skript file auch schon definiert.

aber wenn ich clear all, close all mache ändert das nichts.

habe 2 for-schleifen und eine weiter function in "meiner" function drin.

Kann es da zu Problemen kommen?
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 02.02.2012, 22:07     Titel:
  Antworten mit Zitat      
Lass dein m-File mal mit der "function .." Zeile anfangen und sag, ob der Fehler nach wie vor der gleiche ist...
Private Nachricht senden Benutzer-Profile anzeigen
 
redjat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 02.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 23:46     Titel:
  Antworten mit Zitat      
(immer noch das gleiche, irgendwie kann der bezug zu x0 und t nicht hergestellt werden, weil die unterringelt sind, obwohl sie definiert werden.... :/ )


Code:

function [PopulationComp] = projection(x0,t)
%   calculates the composition of a population:
%   after t years and from a starting population x0
%   by using a given Matrix L including
%   probabilities and reproduction rates of each age class


x0 =input('vector with start population(x0)');
t =input('time period: ');


p = [0.405; 0.5; 0.5; 0.4; 0.2; 0.0];      

pEggGetsOne = 0.3;                        

m = [1; 2.5; 3.5; 5; 6; 7];                

F = pEggGetsOne * m;                      

L = zeros (6,6);                          

L(1,1:6) = F(1:6,1);                  


L(2,1) = p(1);
L(3,2) = p(2);
L(4,3) = p(3);
L(5,4) = p(4);
L(6,5) = p(5);

[V, D] = eig(L);        

 
X = zeros (6, t+1);          
X(:,1) = x0;                

for k = 2:t+1;
    X(:,k) = V * D^k * inv(V) * x0 ;      
end

s = 0:t;  
figure(1);
semilogy(s,X')          
title('Population  after t years')
xlabel('Time period (t)')          
ylabel('Log(Population)')    

legend('First age class', 'Second age class', 'Third age class', 'Fourth age class', 'Fifth age class', 'Sixth age class')

G = zeros(6, t+1);

for k = 1:t+1
    G(:,k) = X(:,k)/sum(X(:,k));  
end


s = 0:t;
figure(2);
plot(s,G')
title('composition')
xlabel('Time period')
ylabel('Percentages')
legend('First age class', 'Second age class', 'Third age class', 'Fourth age class', 'Fifth age class', 'Sixth age class')

PopulationComp = G;

 


edit by denny: bitte die Codeumgebung verwenden. Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
rainer87
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 22.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2012, 02:43     Titel:
  Antworten mit Zitat      
Code:

function [PopulationComp] = projection(x0,t)
% calculates the composition of a population:
% after t years and from a starting population x0
% by using a given Matrix L including
% probabilities and reproduction rates of each age class


x0 =input('vector with start population(x0)');
t =input('time period: ');


wofür hast du in der ersten zeile x0 und t als übergabeparameter definiert?
die werden natürlich mit der eingabe von x0 und t in den letzten beiden zeilen in dem auschnitt hier überschrieben.

also wenn du in einem m file die funktion mit deinen parameter x0 und t schon aufrufst, dann solltest du die erneute eingabe von x0 und t löschen.


nebenbei in zeile 38 steht bei dir:


Code:
X(:,k) = V * D^k * inv(V) * x0 ;


ersetze das durch
Code:
X(:,k) = V * D^k * /V * x0 ;

ist schneller und matlab sollte dir das auch vorschlagen. (auch wenn es wohl nicht so auf geschwindigkeit gerade ankommt.
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 03.02.2012, 09:17     Titel:
  Antworten mit Zitat      
rainer87 hat Folgendes geschrieben:
wofür hast du in der ersten zeile x0 und t als übergabeparameter definiert?
die werden natürlich mit der eingabe von x0 und t in den letzten beiden zeilen in dem auschnitt hier überschrieben.


Das sollte aber keinen Error auslösen, sondern wenn überhaupt eine MLint-Message. Und in der Tat, wenn ich die Funktion bei mir benutze, funktioniert sie (bis auf die inv(V)-Zeile).
Private Nachricht senden Benutzer-Profile anzeigen
 
redjat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 02.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2012, 10:12     Titel:
  Antworten mit Zitat      
habe inv(V) ersetzt, das läuft schneller, danke!


aber das wesentliche problem ist die funktion, die muss irgendwie laufen.


wenn ich das:

x0 =input('vector with start population(x0)');
t =input('time period: ');


rausnehme und vor dem bentzen der funktion definiere ( x0=[2;2;2;2;2;2] , t=20 ) sind die beiden variablen nicht mehr rot unterringelt (in der funktion) aber es funktioniert trotzdem nicht.

FEhlermeldung:


function [PopulationComp] = projection(x0,t)
|
Error: Function definitions are not permitted in this context.
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 03.02.2012, 12:38     Titel:
  Antworten mit Zitat      
1) Erstelle eine neue Textdatei namens projection.m
2) Kopiere deinen Quelltext ab function ... rein
--> Das muss funktionieren!
Private Nachricht senden Benutzer-Profile anzeigen
 
redjat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 02.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2012, 13:11     Titel:
  Antworten mit Zitat      
okee, es funktioniert jetzt.

ich glaube das problem war nur, dass ich die funktion komplett markiert habe,
rechts klick --> evaluate selection --> dann kommt nach wie vor die fehlermedlung;


wenn ich aber im matlab command window

[PopulationComp] = projection(x0,t) geht es. allerdings nur wenn ich x0 und t vorher definiert habe.


Ist es auch möglich die beiden variablen als input in die funktion zu schreiben oder ist es unumgänglich beide vorm starten der funktion zu definieren?


danke schon und nochmal!Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 03.02.2012, 13:47     Titel:
  Antworten mit Zitat      
es ist überhaubt nicht nötig sie vorher zu definieren. du kannst sie auch gleich übergeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
redjat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 02.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2012, 22:13     Titel:
  Antworten mit Zitat      
wenn ichs davor nicht definierte gibt matlab an, dass x0 unknown is...
Private Nachricht senden Benutzer-Profile anzeigen
 
rainer87
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 22.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2012, 22:25     Titel:
  Antworten mit Zitat      
du kannst ja n standard fall erstellen im skript, der in der funktion abgefangen wird.
Code:

if ~exist(x0,'var')
x0=-1;
end
if ~exist(t,'var')
t=-1
end
projection(x0,t)
 


code in der funktion
Code:

if x0==-1
x0=input('her mit dem wert')
end
if t==-1
t=input('her mit der zeit')
end

dann hast du deine manuelle eingabe wieder, so wie du dir das gedacht hast.
Private Nachricht senden Benutzer-Profile anzeigen
 
redjat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 02.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2012, 12:45     Titel:
  Antworten mit Zitat      
ahja, super, dankesehr!
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.