Lösen eines GLS durch finden der passenden Ziffern
Tamu
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 16.04.2017, 12:18
Titel: Lösen eines GLS durch finden der passenden Ziffern
Hallo liebe Community,
auf meiner Suche nach Übungsaufgaben, um fitter in matlab zu werden, bin ich auf folgende Aufgabe gestoßen:
Bestimmen sie die Buchstaben A, B, C, D, E und F aus der
Menge {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} , sodass folgende Gleichung erfüllt
ist: 9D800^4 + 21751A^4 + 4145BC^4 = 42E48F^4.
mein Ansatz war das ganze in mehreren for-Schleifen zu lösen. In etwa so:
for a=0:9
g_zs=g_zs+a;
for b=0:9
g_ds=g_ds+b*10;
for c=0:9
g_ds=g_ds+c*1;
for d=0:9
g_es=g_es+d*1000;
for e=0:9
g_vs=g_vs+e*1000;
for f=0:9
g_vs=g_vs+f;
end end end end end end
hast du die Möglichkeit eine andere Programmiersprache zu nutzen? Matlab ist für so eine Verkettung von for-Schleifen extrem ungeeignet und sehr langsam.
for a=0:9
z1=g_zs+a;
for b=0:9
z2=g_ds+b*10;
for c=0:9
z2=z2+c*1;
for d=0:9
z3=g_es+d*1000;
for e=0:9
z4=g_vs+e*1000;
for f=0:9
z4=z4+f;
ifabs( z3^4 + z1^4 + z2^4 - z4^4)<tol
sol=[a b c d e f];
end end end end end end end
Ich hatte anfangs eigentlich überlegt das Ganze mit Vektoren und Matrizen zu lösen, da matlab ja nicht wirklich dafür bekannt ist mit for-Schleifen zu arbeiten. Aber schien mir dann doch sinnvoller es auf diese Weise zu machen...
Deine Lösung ist super, vielen lieben Dank Der Wink mit der Abbruchbedingung hat mit leider gefehlt.
Ansonsten wird nicht [0, 1, 2, 3, 4, ...] an z4 angehängt, sondern [0, 1, 3, 7, ...].
Dass Matlab schlecht mit Schleifen umgehen kann ist ein Gerücht, dass seit der JIT-Acceleration in der Version 6.5 aus dem Jahr 2002 veraltet ist. Leider halten sich solche Ideen hartnäckig.
Der Code leidet eher unter der wiederholten Berechnung der Potenzen. Schneller:
Code:
for a = 0:9
z1 = (g_zs + a) ^ 4;
for b = 0:9
z22 = g_ds + b * 10;
for c =0:9
z2 = (z22 + c) ^ 4;
for d = 0:9
z3 = (g_es + d * 1000) ^ 4;
for e = 0:9
z44 = g_vs + e * 1000;
for f = 0:9
z4 = (z44 + f) ^ 4;
ifabs(z3 + z1 + z2 - z4) < tol
sol = [a b c d e f] end end end end end end end
for iD = 0:9
xD = zD(iD + 1);
for iA = 0:9
xA = zA(iA + 1);
for iB = 0:9 for iC = 0:9
xBC = zBC(iB + 1, iC + 1);
for iE = 0:9 foriF = 0:9
xEF = zEF(iE + 1, iF + 1);
ifabs(xD + xA + xBC - xEF) < tol
sol = [iA, iB, iC, iD, iE, iF] end end end end end end end toc
ich habe es interessehalber auch mal ohne geschachtelte Schleife versucht:
Code:
nums = 0:999999;
for k = 6:-1:1
kombis(k,:) = floor(nums / 10^(k-1));
nums = nums - kombis(k,:)*10^(k-1);
end
A = kombis(1,:);
B = kombis(2,:);
C = kombis(3,:);
D = kombis(4,:);
E = kombis(5,:);
F = kombis(6,:);
Hallo Jan und Harald,
vielen Dank für eure Ratschläge und Ideen.
Jan, du meintest ich habe einen kleinen Fehler. Ich komme aber trotzdem mit meinem Code auf das richtige Ergebnis. Woran könnte das liegen? Oder habe ich etwas übersehen?
tic
for a=0:9
sum1=g_zs+a;
for b=0:9
sum2=g_ds+b*10;
for c=0:9
sum2=sum2+c*1;
for d=0:9
sum3=g_es+d*1000;
for e=0:9
sum4=g_vs+e*1000;
for f=0:9
sum4=sum4+f;
if sum3^4+sum1^4+sum2^4-sum4^4 == 0
sol=[a b c d e f];
end
end
end
end
end
end
end
toc
tic for a=0:9
sum1=g_zs+a;
for b=0:9
sum2=g_ds+b*10;
for c=0:9
sum2=sum2+c*1;
for d=0:9
sum3=g_es+d*1000;
for e=0:9
sum4=g_vs+e*1000;
for f=0:9
sum4=sum4+f;
if sum3^4+sum1^4+sum2^4-sum4^4 == 0
sol=[a b c d e f];
end end end end end end end toc
% Ausgabe der Lösung im cmd wd disp(' ');
disp('Die Gleichung ist erfüllt, wenn');
disp('für die Ziffern gilt: ');
disp(['A= ', num2str(sol(1)),'; B= ', num2str(sol(2)),...
'; C= ', num2str(sol(3)),'; D= ', num2str(sol(4)),...
'; E= ', num2str(sol(5)),'; F= ', num2str(sol(6))]);
Hier wird zu g_vs zuerst 0*1000 addiert, dann 1*1000, dann 2*2000 usw. Du erhältst also g_vs, g_vs+1000, g_vs+3000 usw, aber niemals g_vs+2000 oder g_vs+4000. Dass Du trotzdem das richtige Ergebnis findest, ist reiner Zufall.
Im aktuellen Code ist das Problem nicht mehr vorhanden, weil Du korrekt "sum4 = g_vs + ..." berechnest und nicht mehr "g_vs = g_vs + ...".
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.