%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
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([01]);
ylim([-0.25100]);
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);
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?
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:
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.
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 ;)
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.
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:
% 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
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([01]);
ylim([-0.25100]);
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);
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.
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 ;)
Einstellungen und Berechtigungen
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
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.