Diskuze: Vektorovy pocet...
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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 PocetDilkuJednohoStupne = 2;
int DilkuVjedneOtacce = 360 * PocetDilkuJednohoStupne + 1;
double UhelMeziZuby = 360/PocetZubu;
double[][] Fcakt = new double[][] { new double[PocetZubu], new
double[PocetDilkuJednohoStupne]};
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)/PocetDilkuJednohoStupne - KSI;
if (FIaktualni < FIst || FIaktualni > FIex)
{
FIaktualni = 0;
}
// Vypocet aktualni tloustky trisky.
double Hakt = fz * Math.Sin(FIaktualni) * 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[AktualniZub][AktualniDilek] = Kc * Aakt;
}
}
}
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í
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[DilkuVjedneOtacce ]};
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.
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#.
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.
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.
V tom případě hledej BLAS/LAPACK pro .NET, abys měl alespoň nějakou rozumnou podporu vektorizace.
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ě
Proč právě C#?
Pokud vím, obecně se nahrazuje matlab pomocí pythonu a jeho vědeckých knihoven jako scipy, numpy, atd
Zobrazeno 12 zpráv z 12.