Zaloguj się
Blog na Matlablog
Forum polskich użytkowników
 
UŻYTKOWNICY GRUPY PROFIL Zaloguj się, by sprawdzić wiadomości FAQ
 



Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

[Octave] Program liczy wolno
Forum MATLAB Strona Główna-> Klony Matlaba (Scilab, Octave, ...)
Post Wysłany: 21 Czerwca 2016, Wto 12:48 pm Temat postu: [Octave] Program liczy wolno Odpowiedz z cytatem
 
AUTOR:
Yogi_
Początki pisania


Dołączył: 25 Lip 2011
Posty: 7


Ogląda profil użytkownika Wyślij prywatną wiadomość
Witam Smile
Mam plik:
Kod:

# Created by Octave 3.8.1, Sat Jun 11 21:56:22 2016 CEST <krzysiek@krzysiek-Inspiron-5737>
# name: gitara
# type: matrix
# rows: 8910720
# columns: 7
 
20 25 30 30 35 35 0.8
 20 25 30 30 35 40 0.7000000000000001
 20 25 30 30 35 45 0.6222222222222222
 20 25 30 30 35 50 0.5599999999999999
 20 25 30 30 35 55 0.5090909090909091
 20 25 30 30 35 55 0.5090909090909091
 20 25 30 30 35 60 0.4666666666666667
 20 25 30 30 35 75 0.3733333333333334
 20 25 30 30 35 90 0.3111111111111111
 20 25 30 30 35 100 0.28
 20 25 30 30 35 120 0.2333333333333334
 20 25 30 30 35 127 0.2204724409448819
...

Oraz program, który go używa:

Kod:

%wersja 0.7

gitara
= [];
tmp=[];
load gitara.txt
m
= rows(gitara);
%
Sp = 25.4/6;
Sp = 4;
ABmax = 125 %maksymalna ilość zębów pary AB
CDmax
= 187 %maksymalna ilość zębów pary CD
EFmax
= 187 %maksymalna ilość zębów pary EF

nort1
=[24/24,24/26,24/28,24/30,24/32,24/36,24/38,24/40,24/44];
%
nort2=[24/24,26/24,28/24,30/24,32/24,36/24,38/24,40/24,44/24];
Snm=[0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.6,0.7,0.75,0.8,0.9,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3];
%
Snc=[
%
Snm=[0.01,0.05,0.1]

zdp = fopen("metryczne.txt","a");

a=0;
b=0;
c=0;
tmp = zeros(m,1);
[
wiersz, ile_gw] = size(Snm);


tic()                 
for
i = 1:m
  
for j = 1:ile_gw;
      
Sn = Snm(j);
    
l=Sn/Sp;

    for
nort = 1:9
      tmp
(i,1)=abs(gitara(i,7)*nort1(nort)-l);
    
      
r =min(tmp);
      
r = r + 1e-09;
      
rz abs(gitara(i,7)*nort1(nort)-l);
        if (
rz r)
        
Sum_ab = gitara(i,1) + gitara(i,2);
        
Sum_cd = gitara(i,3) + gitara(i,4);
        
Sum_ef = gitara(i,5) + gitara(i,6);
          if (
Sum_ab <= ABmax && Sum_cd <= CDmax && Sum_ef <= EFmax)
            
fprintf(zdp,'%g %g %g %g %g %g %g %g %g\n',Sn, gitara(i,1:6),Sn-Sp*gitara(i,7)*nort1(nort),nort);
             %
printf('%g %g %g %g %g %g %g %g %g\n',Sn, gitara(i,1:6),Sn-Sp*gitara(i,7)*nort1(nort),nort);
          endif   
       endif
      
c=c+1;
    
end
    b
=b+1;
 
end
  a
=a+1;
end
fclose
("metryczne.txt");
exec_time = toc()
c
b
a

Pytanie: czy jeśli podzielę plik gitara.txt na kilka części (10?) i uruchomię kilka instancji octave to wyniki uzyskam szybciej?
Bo liczy się już trzeci dzień, może jakoś zmienić program?

Pozdrawiam
Krzysiek


 

Post Wysłany: 22 Czerwca 2016, Sro 5:10 am Temat postu: Odpowiedz z cytatem
 
AUTOR:
Łazik
Może pisać książki


Dołączył: 31 Maj 2013
Posty: 100
Skąd: Polska


Ogląda profil użytkownika Wyślij prywatną wiadomość
Chcesz dzielić plik danych wejściowych na kilka części i liczyć równolegle. Tu jest mały problem, bo linijka 38 uzależnia wyniki kolejnych obliczeń od poprzednich iteracji.

Nie mam doświadczenia z Octavem, jednak to nie powinno mieć wpływu na poniższe uwagi.

Warto by było zacząć od sprawdzenia, czy program działa dla 1k wierszy i w jakim czasie.

Zweryfikuj czy program liczy to co powinien liczyć.
Linijki 36 do 40 budzą trochę wątpliwości.

Program warto by było zoptymalizować, inkrementacja zmiennych a,b,c co pętlę, w sytuacji kiedy te zmienne do niczego nie służą w tych pętlach a ich wartości na końcu programu można z góry określić wydaje się nie mieć sensu. Wiele wartości jest liczonych niepotrzebnie, po wielokroć, patrz linijki 33, 42 do 45.

Następnie możesz sprawdzić czasy działania dla 1k, 2k, 4k, 8k, ... wierszy by oszacować ile zajmie wykonanie Twoich 8.9M wierszy zanim się w ogóle zabierzesz za finalne obliczenia. Przy tej ilości danych którą masz, ostateczny czas obliczeń powinien być dużo krótszy, na pewno nie liczony w dniach, raczej w minutach. Ile zajmuje plik gitara.txt? 250 MB?



_________________
cody/players/4345310
 

Post Wysłany: 22 Czerwca 2016, Sro 4:00 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Yogi_
Początki pisania


Dołączył: 25 Lip 2011
Posty: 7


Ogląda profil użytkownika Wyślij prywatną wiadomość
Łazik napisał:
Chcesz dzielić plik danych wejściowych na kilka części i liczyć równolegle. Tu jest mały problem, bo linijka 38 uzależnia wyniki kolejnych obliczeń od poprzednich iteracji.

Dzięki!!! Ta linijka jest bez sensu Sad
Zaczynam kombinować inaczej.


 

Post Wysłany: 22 Czerwca 2016, Sro 5:39 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Łazik
Może pisać książki


Dołączył: 31 Maj 2013
Posty: 100
Skąd: Polska


Ogląda profil użytkownika Wyślij prywatną wiadomość
Jeśli możesz, napisz co/jak chcesz policzyć. Chętnie pomogę.



_________________
cody/players/4345310
 

Post Wysłany: 23 Czerwca 2016, Czw 12:24 am Temat postu: Odpowiedz z cytatem
 
AUTOR:
Yogi_
Początki pisania


Dołączył: 25 Lip 2011
Posty: 7


Ogląda profil użytkownika Wyślij prywatną wiadomość
Łazik napisał:
Jeśli możesz, napisz co/jak chcesz policzyć. Chętnie pomogę.

OK Smile
Chcę policzyć jak poukładać koła zębate pomiędzy wrzecionem a śrubą pociągową w tokarce (tzw. gitara) dla konkretnego skoku gwintu.
Tabelki na stronie http://metal.palka.name/dtr_tsa_16/rys15_1.gif pokazują ułożenie kół dla śruby pociągowej o skoku 6 zwojów na cal. Moja tokarka ma wymienioną śrubę na metryczną 4mm i tabele są nieaktualne.
Matematycznie układ kół wygląda tak:
Sn - skok gwintu
Sp - skok śruby pociągowej
Sn/Sp = A/B*C/D*E/F*[G/H].
Grupa [G/H] ujęta w nawias aby podkreślić, że jest to tzw. "skrzynka Nortona" o stałych wybieranych przełożeniach.
Koła połączone znakiem dzielenia "/" zazębiają się a znakiem mnożenia "*" są umieszczone na tej samej osi i poruszają się razem.Tak to wygląda:


Na początku wygenerowałem plik gitara.txt korzystając z następujących kół zębatych:
Kod:

20 25 30 30 35 35 40  45 50 55 55 60 75 90 100 120 127

takim skryptem:
Kod:

load tsa16_1
.txt

gitara
= [];%na wszelkie "W" czyści macierz "gitara"
gitara = pick(tsa16_1,6,'o');
[
wiersz,kolumna] = size(gitara);

  for
i=1:wiersz
      gitara
(i,7) = (gitara(i,1)/gitara(i,2))*(gitara(i,3)/gitara(i,4))*(gitara(i,5)/gitara(i,6));
 
end

save gitara
.txt gitara
%quit

Skrypt pick.m liczy (akurat w tym przypadku) permutacje bez powtórzeń.

Kod:

% pick    Picking elements from a set (combinations, permutations)
%
%   
s = pick(V,k,Type)
%
%   
Gives all possibilities of picking k elements from the
%   set V with or without order and repetition. V can be an
%   array of any size and any type.
%
%   
Type can have the following values: '', 'o', 'r', 'or'.
%     
'o' means pick ordered set of k elements
%     'r' means replace elements after picking
%
%   
s is an array with all picks, one subset per row.

Chciałem uzyskać efekt aby dla jak największej liczby gwintów z tablicy Snm (a później Snc - calowe) przekładać jak najmniej kół zmianowych jednocześnie wykorzystując jak najwięcej przełożeń skrzynki nortona.
Koło "G" przesuwa się "wajchą" zazębiając z poszczególnymi kołami "H".
Najlepiej byłoby gdyby (Sn/Sp) -(A/B*C/D*E/F*[G/H]) był równy zero.
W międzyczasie coś kombinowałem Smile .
1. Zlikwidowałem dublujące się linie, pick.m niestety zamienia miejscami powtarzające się koła zębate,
2. zmniejszyłem ręcznie ilość linii w pliku gitara.txt, wszystkie linie zaczynające się od 45 w górę usunięte - fizycznie nie ma miejsca na większe koło zębate "A"
3. co pozwoliło mi na usunięcie warunków na łączną ilość zębów ABmax. Czyli wyszło coś takiego:
Kod:

%wersja 0.8

gitara
= [];
%
tmp=[];
load gitara.txt
m
= rows(gitara);
%
Sp = 25.4/6;
Sp = 4;

nort1=[24/24,24/26,24/28,24/30,24/32,24/36,24/38,24/40,24/44];
%
nort2=[24/24,26/24,28/24,30/24,32/24,36/24,38/24,40/24,44/24];
Snm=[0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.6,0.7,0.75,0.8,0.9,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3];
%
Snc=[
%
Snm=[0.01,0.05,0.1]

zdp = fopen("metryczne.txt","a");


%
tmp = zeros(m,1);
[
wiersz, ile_gw] = size(Snm);


tic()
for
j = 1:ile_gw;
      
Sn = Snm(j);
    
l=Sn/Sp;                 
   for
i = 1:m

    
for nort = 1:9
          bl
= abs(l-gitara(i,7)*nort1(nort));
          if (
bl < 0.00001)
            
fprintf(zdp,'%g %g %g %g %g %g %g %g %g\n',Sn, gitara(i,1:6),Sn-Sp*gitara(i,7)*nort1(nort),nort);
             %
printf('%g %g %g %g %g %g %g %g %g\n',Sn, gitara(i,1:6),Sn-Sp*gitara(i,7)*nort1(nort),nort);
          endif   
      
      
    
end
    
  end
 
end
fclose
("metryczne.txt");
exec_time = toc()

Na razie tyle, maszyna liczy a ja idę spać. Smile

Aaaa... nie idę, jeszcze chwila. Skrypt pick.m jest na dysku Google. Dołożyłem tam też program gitara.exe jako przykład (znaleziony w necie) obliczeń. Tylko tam autor poszedł na łatwiznę i liczy dla wszystkich możliwych kół zębatych pomiędzy zakresami min max zębów.
https://drive.google.com/folderview?id=0Bwye_X8jmAgfUEpMMTBBYWFYME0&usp=sharing
Teraz dobranoc Razz

Pozdrawiam
Krzysiek


 

Post Wysłany: 23 Czerwca 2016, Czw 1:36 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Yogi_
Początki pisania


Dołączył: 25 Lip 2011
Posty: 7


Ogląda profil użytkownika Wyślij prywatną wiadomość
Policzył i to w miarę szybko Smile
Kod:

exec_time
5958.1

Zaczynam kombinować z gwintami calowymi.

Pozdrawiam
Krzysiek


 

Post Wysłany: 19 Lutego 2017, Nie 10:11 am Temat postu: Odpowiedz z cytatem
 
AUTOR:
andrzej65



Dołączył: 19 Lut 2017
Posty: 3


Ogląda profil użytkownika Wyślij prywatną wiadomość
to są nie jest dokładnie zrobione



_________________
link
 

Post Wysłany: 2 Marca 2017, Czw 12:13 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Yogi_
Początki pisania


Dołączył: 25 Lip 2011
Posty: 7


Ogląda profil użytkownika Wyślij prywatną wiadomość
Witam
andrzej65 napisał:
to są nie jest dokładnie zrobione

Coś więcej?


 

Forum MATLAB Strona Główna-> Klony Matlaba (Scilab, Octave, ...)
Wyświetl posty z ostatnich:   

Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

Wszystkie czasy w strefie CET (Europa)

Skocz do:  

Statystyki forum:



Od dnia 08.06.2006 forum odwiedzano 38719619
Najwięcej użytkowników 266 było obecnych 19 Lutego 2015, Czw 7:03 pm

Aktualnie online:




Najnowsze posty na forum:
Dla Matlaba 1 jest róşne od 1? Dziwny problem.  (15 Października 2017, Nie 12:38 am)
Wyświetlanie duĹźej ilości punktĂłw  (11 Października 2017, Sro 9:32 pm)
macierz z wektorem na przekątnej  (11 Października 2017, Sro 9:05 pm)
Program antypalgaitowy  (9 Października 2017, Pon 2:18 pm)
Wycinanie twarzy  (9 Października 2017, Pon 10:25 am)
111  (6 Października 2017, Pią 12:57 pm)
Matlab/C# tester - Wrocław  (4 Października 2017, Sro 8:41 am)
Filtr FIR problem  (30 Września 2017, Sob 3:16 pm)
konwolucyjne sieci neuronowe  (29 Września 2017, Pią 6:55 pm)
1  (29 Września 2017, Pią 3:26 pm)
Twoje prawa:
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać plików na tym forum