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

Octave Skript funktioniert nicht in Matlab

 

Ferdi_Fuchs
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 20.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2020, 15:28     Titel: Octave Skript funktioniert nicht in Matlab
  Antworten mit Zitat      
Hallo zusammen,

ich habe im Rahmen einer Mathe Vorlesung über Partielle Differentialgleichungen folgendes Octave Skript bekommen:

Code:
clear
pkg load optim
%Def-x-range of rod: default: [0;1]
L = 1;
x = 0:0.001:L;
%Thermal diffusivity [default: copper 1.11 cm^2/s]
% [steel,stainless: 0.035 cm*cm/s, water: 0.00143 cm*cm/s]
alpha = 0.005;

times = 0:0.01:1;


%Calculate Fourier-coefficients of initial condition u(0,x)
%N = number of fourier modes
N = 150;
for j = 1:N
    f = @(s) sin(j*pi*s/L).*initial_cond_heat_1d(s);
    A(j) = (2/L)*quadgk(f,0,L);
end

k = 1;

figure

for t=0:0.01:1;
    heat_sum = A(1)*exp(-alpha*1*pi*pi*t/(L*L)).*sin(1*pi*x/L);
    for j = 2:N
      heat_sum = heat_sum + A(j)*exp(-alpha*j*j*pi*pi*t/(L*L)).*sin(j*pi*x/L);
    end
    peak_values(k) = heat_sum(500);
    k = k +1;
    plot (x, heat_sum,'r','linewidth',2);
    hold on
    plot (0.5, heat_sum(500),"b",'linewidth',1);
    hold off
    xlim([0 1]);
    ylim([-0.25 100]);
    xlabel("x [m]","fontsize",15);
    ylabel("u [Delta T]","fontsize",15);
    h = legend({sprintf("Temp simulated, Time: %f",t),sprintf("u(0.5) = %f",heat_sum(500))});
    set(h,"fontsize",15);
    grid on;
    figu = gcf ();
    set (figu, "position", [200, 200, 1000, 600]);
    pause (.1);
end

%Define the model function with 3 parameters p(1), p(2) and p(3)
model_f = @(x, p) p(1)./((x+p(3)).^p(2));
%model_f = @(x, p) p(1).*exp(p(2)*(x+p(3)));
%Specify intial guess for the parameters
pin = [1;0.5;0.01];
%wt = weights for the observed data points: Default: All are equally weighted, i.e. (1,1,...)
wt = ones(size(peak_values));
%dp = stepsize for the parameters to find least-square Min
dp = [0.00001;0.00001;0.00001];
%Bounds for the parameters to ensure convergence in specified regions
options.bounds = [0.01,100;0.01,10;0,10];
%Call to leasqr: Return values: f = data points with optimal model function
%Return value: p = optimal model parameters
[f,p]=leasqr(times,peak_values,pin,model_f,0.0000001,20,wt,dp,"dfdp",options);


mit folgender Funktion für die Randbedingung:
Code:
function y = initial_cond_heat_1d(x)
    y = (100).*(x>=0.49).*(x<=0.51);
end
 


Ich arbeite aber lieber mit Matlab, nur funktioniert das Programm dann leider nicht. Das erste Problem scheint gleich in der zweiten Zeile zu bestehen und ich bekomme folgende Fehlermeldung:

Unrecognized function or variable 'pkg'.

Error in simu_heat_1d_decay_est_task1 (line 2)
pkg load optim


Wenn ich die Zeile einfach auskommentiere, führt das Programm zwar erst mal die For-Schleife aus, aber dann bekomme ich wieder eine Fehlermeldung:

Unrecognized function or variable 'leasqr'.

Error in simu_heat_1d_decay_est_task1 (line 61)
[f,p]=leasqr(times,peak_values,pin,model_f,0.0000001,20,wt,dp,"dfdp",options);


Ich glaube übrigens nicht, dass mir irgendwelche Pakete fehlen, da ich eine Campuslizenz habe und zur Sicherheit gleich alle Pakete installiert habe. Hat vielleicht jemand eine Idee, wie ich das Programm in Matlab zum Laufen bekomme?
Private Nachricht senden Benutzer-Profile anzeigen


T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2020, 15:49     Titel:
  Antworten mit Zitat      
Disclaimer: Ich habe von octave null Ahnung.

Code:

Das scheint mir keine valide matlabsyntax zu sein. Versuchst du hier eine variable von der Festplatte zu laden? In Matlab sieht die Syntax dazu so aus:

Code:
load(filename,variables)


siehe auch https://de.mathworks.com/help/matlab/ref/load.html .
Die leasqr-Funktion ist in matlab nicht enthalten, es sieht allerdings so aus als hätte sich hier

https://www.mathworks.com/matlabcen...../code/leasqr.m/index.html

jemand die Mühe gemacht das ganze nachzuprogrammieren, das kannst du ja mal versuchen und schauen ob in matlab das gleiche herauskommt wie mit octave.
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferdi_Fuchs
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 20.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2020, 20:24     Titel:
  Antworten mit Zitat      
Danke für den Hinweis, ich habe den Code aus dem Link in eine Funktion kopiert und das Programm nochmal gestartet. Dann bekomme ich aber eine andere Fehlermeldung:

Error using leasqr (line 112)
input(x)/output(y) data must have same number of rows

Error in simu_heat_1d_decay_est_task1 (line 61)
[f,p]=leasqr(times,peak_values,pin,model_f,0.0000001,20,wt,dp,"dfdp",options);


Die für x und y eingesetzten Variablen haben aber denselben Datentyp (1x101 double), weshalb ich die Fehlermeldung nicht nachvollziehen kann. Wenn ich den Code entsprechend ändere, damit der Fehler nicht mehr auftritt, bekomme ich wieder eine andere Fehlermeldung. Scheint ein Teufelskreis zu sein... Ich glaube es ist doch einfacher, wenn ich mich mit Octave anfreunde.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.07.2020, 22:08     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wenn ich den Code entsprechend ändere, damit der Fehler nicht mehr auftritt, bekomme ich wieder eine andere Fehlermeldung.

Was ist der aktuelle Stand des Codes und was ist die aktuelle Fehlermeldung?

Zitat:
Ich glaube es ist doch einfacher, wenn ich mich mit Octave anfreunde.

Wenn man Code hat, der für eine Sprache geschrieben wurde, ist es immer am einfachsten, ihn auch in dieser Sprache auszuführen.

Wenn ich das richtig verstehe, führt leasqr eine nichtlineare Regression aus. Dafür würde ich in MATLAB lsqcurvefit verwenden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 02.07.2020, 06:09     Titel:
  Antworten mit Zitat      
Ich denke das ist eine Gelegenheit für MathWorks dem Mathematik-Professor / der Professorin zu helfen die Unterlagen MATLAB-kompatibel anzubieten. Bei PN kümmere ich mich gerne darum.

Andreas (Goser, MathWorks)
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Ferdi_Fuchs
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 20.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2020, 20:27     Titel:
  Antworten mit Zitat      
Danke für den Hinweis mit der lsqcurvefit Funktion. Ich habe diese Funktion anstelle von leasqr verwendet. Dafür musste ich zusätzlich noch das x und das p in der Modellfunktion vertauschen (model_f = @(p, x) anstatt model_f = @(x, p)) und pkg load optim auskommentieren. Hier ist nochmal der gesamte Code:

Code:
clear
% pkg load optim
% Def-x-range of rod: default: [0;1]
L = 1;
x = 0:0.001:L;
% Thermal diffusivity [default: copper 1.11 cm^2/s]
% [steel,stainless: 0.035 cm*cm/s, water: 0.00143 cm*cm/s]
alpha = 0.005;

times = 0:0.01:1;


% Calculate Fourier-coefficients of initial condition u(0,x)
% N = number of fourier modes
N = 150;
for j = 1:N
    f = @(s) sin(j*pi*s/L).*initial_cond_heat_1d(s);
    A(j) = (2/L)*quadgk(f,0,L);
end

k = 1;

figure

for t=0:0.01:1;
    heat_sum = A(1)*exp(-alpha*1*pi*pi*t/(L*L)).*sin(1*pi*x/L);
    for j = 2:N
      heat_sum = heat_sum + A(j)*exp(-alpha*j*j*pi*pi*t/(L*L)).*sin(j*pi*x/L);
    end
    peak_values(k) = heat_sum(500);
    k = k +1;
    plot (x, heat_sum,'r','linewidth',2);
    hold on
    plot (0.5, heat_sum(500),"b",'linewidth',1);
    hold off
    xlim([0 1]);
    ylim([-0.25 100]);
    xlabel("x [m]","fontsize",15);
    ylabel("u [Delta T]","fontsize",15);
    h = legend({sprintf("Temp simulated, Time: %f",t),sprintf("u(0.5) = %f",heat_sum(500))});
    set(h,"fontsize",15);
    grid on;
    figu = gcf ();
    set (figu, "position", [200, 200, 1000, 600]);
    pause (.1);
end

% Define the model function with 3 parameters p(1), p(2) and p(3)
model_f = @(p, x) p(1)./((x+p(3)).^p(2));
% model_f = @(x, p) p(1).*exp(p(2)*(x+p(3)));
% Specify intial guess for the parameters
pin = [1;0.5;0.01];
% wt = weights for the observed data points: Default: All are equally weighted, i.e. (1,1,...)
wt = ones(size(peak_values));
% dp = stepsize for the parameters to find least-square Min
dp = [0.00001;0.00001;0.00001];
% Bounds for the parameters to ensure convergence in specified regions
% options.bounds = [0.01,100;0.01,10;0,10];
% Call to leasqr: Return values: f = data points with optimal model function
% Return value: p = optimal model parameters
% [f,p]=leasqr(times,peak_values,pin,model_f,0.0000001,20,wt,dp,"dfdp",options);

% new code
options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [0.01,0.01,0]; % lower bounds for the parameters
ub = [100,10,10];   % upper bounds for the parameter
[p,resnorm2,residual2,exitflag2,output2] = lsqcurvefit(model_f,pin,times,peak_values,lb,ub,options);


Ich bekomme zwar immer noch folgende Warnung:

Warning: The Levenberg-Marquardt algorithm does not handle bound constraints; using the trust-region-reflective
algorithm instead.
> In lsqncommon (line 59)
In lsqcurvefit (line 280)
In simu_heat_1d_decay_est_task1 (line 67)


Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to
its initial value is less than the value of the function tolerance.

<stopping criteria details>

aber die berechneten Parameter der Modellfunktion sind genau dieselben wie im Octave Code. Der Maltab Code ist sicher noch nicht perfekt, aber für meine Zwecke ausreichend.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.07.2020, 20:41     Titel:
  Antworten mit Zitat      
Hallo,

Abhilfe für die Warnung dürfte sein, die options wegzulassen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.