Diskuze: Vektorovy pocet...

C# .NET .NET (C# a Visual Basic) Vektorovy pocet... American English version English version

Avatar
Jarda
Člen
Avatar
Jarda:

Zdravím vás. Programuji aplikaci v Matlabu a chtěl bych jí přeprogramovat do C#. V té matlabovské aplikaci pracuji s vektory. Chtěl jsem se zeptat, zda má někdo zkušenosti s vektory a jestli treba nema nekdo nejakou referenci ci video, na ktere me odkaze...já jsem bohužel nic nenašel. Vektor bych si chtěl pak vykreslit do grafu, takže výsledek by měl vypadat takto: http://learn-czech.net/FcTime.png . Modrá křivka je závislost celkové řezné síly na čase a zelená čára je závislost jednotlivých řezných sil na 1 zub na čase.
Předem děkuji za reakci a přeju pěkný den.

%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Zadane hodnoty:
fz = 0.2; % posuv na zub [mm]
kappa = 45; % uhel nastaveni hlavniho ostri britu nastroje [°]
Z = 10; % Pocet vymenitelnych britovych desticek na freze
FIst = 0; % Pocatecni uhel zaberu [°].
FIex = 180; % Koncovy uhel zaberu [°].
ap = 3; % Koncovy uhel zaberu [mm].
Kc = 2700; % Merny rezny odpor [MPa].
D = 100; % Prumer nastroje [mm].
vc = 200; % Rezna rychlost [m/min].
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vektor aktualniho uhlu FI a casoveho vektoru casu. Vektor o 1 radku, 721 sloupcich.
FI = 0:0.5:360;
% Vektor casu, ktery zavisi na uhlu zaberu, prumeru nastroje, rezne rychlosti.
Time = FIDpi60/(360100­0*vc);
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Uhel FI pro vsechny zuby. Vektor o 10 radcich, 721 sloupcich
FIforAllTeeth = repmat(FI,Z,1);
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Uhel FI pro vsechny zuby s tim, ze to FI aktualni pro jednotlive zuby prepocita, jelikoz kdy je tam X zubu, jsou zuby posunuty o uhel mezi zuby.
Zaktualni = 1:Z; % Vektor pro počet zubů 1 až N
KSI = ((Zaktualni-1) * 360/Z)'; % Uhel vzdalenosti zubu od sebe pro kazdy zub od pocatku>>>[0;36;7­2;108;144;180;216;252;28­8;324]
KSIforAllTeeth = repmat(KSI,1,721); % Uhel KSI pro vsechny zuby, nutno matici KSI takto nakopirovat pro vsechny uhly.
FIaktualni = FIforAllTeeth - KSIforAllTeeth; % Výpočet samotného úhlu FIaktualni
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Osetreni FIaktualni zpusobem, ze to vynuluje uhly, ktere jsou mimo zaber.
FIaktualni(or(FI­aktualni < FIst, FIaktualni > FIex)) = 0;
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vypocet aktualni tloustky trisky.
Hakt = fz * sind(FIaktualni) * sind(kappa);
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vypocet aktualni tloustky trisky.
Hakt = fz * sind(FIaktualni) * sind(kappa);
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vypocet sirky trisky.
B = ap/sind(kappa);
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vypocet aktualniho prurezu odebiraneho materialu.
Aakt = Hakt * B;
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vypocet aktualni rezne sily.
Fcakt = Kc * Aakt;
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vypocet celkove rezne sily.
Fcsouc = ones(1,Z) * Fcakt;
%%%%%%%%%%%%%­%%%%%%%%%%%%%%
% Vykresleni grafu.
figure(1);
hold off;
plot(Time, Fcakt,'g', 'LineWidth',2);
hold on;
plot(Time, Fcsouc,'b', 'LineWidth',2);
xlabel('t [s]');
ylabel('Fc [N]');

Editováno 5.5.2015 15:48
 
Odpovědět 5.5.2015 15:45
Avatar
Lako
Člen
Avatar
Odpovídá na Jarda
Lako:

Ahoj.
Jak moc rozumíš tomu matlabu?
Je to trochu jiný přístup přes ty vektory - a nejde jenom o grafy.

Třeba toto:

FI = 0:0.5:360;

bys v c# řešil tako:

List<double> FI =new List<double>();

            for (double i = 0; i <= 360; i+=0.5)
                FI.Add(i);

Samozřejmě existuje více způsobů...

A grafy v c# to je další věc... Jsou na to různé knihovny ve wpf se mi osvědčila tato: http://oxyplot.org/

Celkově v tom nevidím žádnou horko těžko zvladatelnou věc.

 
Nahoru Odpovědět 6.5.2015 15:43
Avatar
Jarda
Člen
Avatar
Odpovídá na Lako
Jarda:

Ahoj, děkuji za reakci. Matlabu rozumím. Dá se to tam programovat přes for cykly, ale i vektorově. Zajímalo mě, zda to jde v C# také. Předělal jsem ten předchozí kod do for cyklu a zkusil jsem napsat kod v C#, ale zatím nevím, jak to zkusit vykreslit do grafu ve WPF - abych dostal graf, který je ve výše uvedeném odkazu.

private void setGraph()
{
double fz = 0.2;
double kappa = 45;
double FIst = 0;
double FIex = 180;
double ap = 3;
double Kc = 2700;
double D = 100;
double vc = 200;
int PocetZubu = 10;
int PocetDilkuJed­nohoStupne = 2;
int DilkuVjedneOtacce = 360 * PocetDilkuJed­nohoStupne + 1;
double UhelMeziZuby = 360/PocetZubu;
double[][] Fcakt = new double[][] { new double[PocetZubu], new double[PocetDil­kuJednohoStup­ne]};

for (int AktualniZub = 1; PocetZubu >= AktualniZub; AktualniZub++)
{
for (int AktualniDilek = 1; DilkuVjedneOtacce >= AktualniDilek; AktualniDilek++)
{
// Vypocet aktualniho uhlu zaberu.
double KSI = (AktualniZub-1) * UhelMeziZuby;
double FIaktualni = (AktualniDilek-1)/PocetDilku­JednohoStupne - KSI;
if (FIaktualni < FIst || FIaktualni > FIex)
{
FIaktualni = 0;
}
// Vypocet aktualni tloustky trisky.
double Hakt = fz * Math.Sin(FIak­tualni) * Math.Sin(kappa);
// Vypocet sirky trisky.
double B = ap/Math.Sin(kappa);
// Vypocet aktualniho prurezu odebiraneho materialu.
double Aakt = Hakt * B;
// Vypocet aktualni rezne sily.
Fcakt[Aktualni­Zub][Aktualni­Dilek] = Kc * Aakt;
}
}

}

 
Nahoru Odpovědět 6.5.2015 15:54
Avatar
Jarda
Člen
Avatar
Odpovídá na Lako
Jarda:

Můžu se ještě zeptat, zda je možno použít tzv. "dynamické grafy" - v tom smyslu, že si je můžu libovolně zoomovat podle potřeb? Právě v Matlabu se kterýkoliv graf dá nazoomovat. Pro matematické funkce je to dobré, ale na vytváření aplikací, to se mi moc nelíbí :)

 
Nahoru Odpovědět 6.5.2015 15:57
Avatar
Jarda
Člen
Avatar
Odpovídá na Jan Vargovský
Jarda:

Děkuji za odpověď. Zkusím si to také najít..
Jinak v tom výše napsaném kodu by mělo být double[][] Fcakt = new double[][] { new double[PocetZubu], new double[DilkuV­jedneOtacce ]};

Jinak, abych to vysvětlil...Jedná se o modelování řezných sil při frézování. V každém řádku toho pole je řezná síla na 1 zub v jedné otáčce (jedna otáčka nástroje má 360°). Počet dílku, na které si rozdělím 360° je právě v proměnné DilkuVjedneOtacce. Vznikne mi tedy vektor o 10 řádcích a 721 sloupcích (rozděleno po půl stupni s tím, že je tam i 0).
Potřebuji vlastně vykreslit v jednom grafu 11 položek. 10 těch položek odpovídá řezným silám na jeden zub v jedné otáčce a jedenáctá položka je celková řezná síla, což je součet všech řádků v každém sloupci, takže ta celková síla je vektor o jednom řádku a 721 sloupcích.

 
Nahoru Odpovědět 6.5.2015 17:12
Avatar
coells
Redaktor
Avatar
Odpovídá na Jarda
coells:

Jen ze zvědavosti, proč bys to chtěl přepisovat do C#? Kód bude delší, složitější a pomalejší. Výhoda matlabu je právě v tom, aby ses s tím nemusel babrat v jazycích typu C#.

 
Nahoru Odpovědět 6.5.2015 21:14
Avatar
Jarda
Člen
Avatar
Jarda:

Tak jsem dal nějak ten graf dohromady :-) - http://www.learn-czech.net/test/FcTime.png
I když musím tam ještě nastavit osy, popisky os, možnost zoomování (jestli to půjde).

@coells: To je dobrý dotaz :-) Tak jako Matlab je výborná věc na funkce všeho typu, grafy, matice, vektory apod. apod. Má to plno možností a v jiných programech se ty funkce musí "bastlit" :-)
Ovšem, co se týče GUI aplikací, tak tam jsou velmi omezené možnosti - je tam jen pár objektů a ještě méně událostí. Ty "wokna" vypadají amatérsky oproti woknům jiných jazyků. Není tam moc možností na změnu. Tak ono, když budu potřebovat nějaké matematické funkce, co jsou v matlabu a v C nebudou, tak si je naprogramuju.
Já spíše ted ze zvědavosti zjištuju, co C# umí a jestli je použitelný pro moje účely. Pro mě je je hlavně důležité pracovat s funkcemi a aby to umělo vykreslovat grafy. Pokud toto jde, tak je vyhráno.

 
Nahoru Odpovědět 6.5.2015 21:50
Avatar
Jarda
Člen
Avatar
Jarda:

A ještě...za další mě štve i ta kompilace. Když to kompiluju v mém pracovním počítači, mám tam plno toolboxů, takže využívám vícero funkcí. Pokud však chci kompilovat v plné verzi Matlabu, kterou máme pouze na jednom počítači na celé univerzitě (licence pro komerční využití je mnohonásobně dražší než pro C nebo jakýkoliv jiný program), tak je strašně osekaná a nejsou tam vesměs žádné toolboxy.
Nehledě na to, další věc je problém se zkompilovanými verzemi - když to pošlu "někomu", tak mu to na jeho kompu jde, druhému ne, tak mám X verzí Matlabu a kompiluju to pro X lidí v jiné verzi. Což ovšem nebude možné v té ostré verzi matlabu, protože tam jsou jen 2 verze.

 
Nahoru Odpovědět 6.5.2015 21:59
Avatar
coells
Redaktor
Avatar
Odpovídá na Jarda
coells:

V tom případě hledej BLAS/LAPACK pro .NET, abys měl alespoň nějakou rozumnou podporu vektorizace.

 
Nahoru Odpovědět 6.5.2015 22:01
Avatar
Jarda
Člen
Avatar
Jarda:

coells: díky za radu :-) Zkusím si to vyhledat. Jinak, je jasné, že když budu chtít pracovat se signály, tak asi využiju jen Matlab. Teorii signálů bych se učit nechtěl (abych si naprogramoval vlastní funkce) :-)...ale tak pro jednoduché funkce typu, jak jsem ukázal, je C# v pohodě :)

 
Nahoru Odpovědět 6.5.2015 22:34
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Jarda
hanpari:

Proč právě C#?

Pokud vím, obecně se nahrazuje matlab pomocí pythonu a jeho vědeckých knihoven jako scipy, numpy, atd

http://stackoverflow.com/…-with-python

 
Nahoru Odpovědět  +1 7.5.2015 6:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.