Nalezeni kombinace odporu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nalezeni kombinace odporu – C / C++ – Fórum – Programujte.comNalezeni kombinace odporu – C / C++ – Fórum – Programujte.com

 

Matej Rychtarik
~ Anonymní uživatel
2 příspěvky
12. 1. 2018   #1
-
0
-

Ahoj,
potřebuji poradit s vytvořením programu co z rezistorové řady vytvoří kombinaci která, bude nejblíže k uživatelem zadanému odporu a v jím zadané toleranci. Když nebude vhodna kombinace 2 tak půjde na 3 atd. Nemohu ale přijít na to, jak dostat program k tomu aby tyto kombinace vytvořil. Ví někdo jak na to?

    Člen

Ahoj,
potřebuji poradit s vytvořením programu co z rezistorové řady vytvoří kombinaci která, bude nejblíže k uživatelem zadanému odporu a v jím zadané toleranci. Když nebude vhodna kombinace 2 tak půjde na 3 atd. Nemohu ale přijít na to, jak dostat program k tomu aby tyto kombinace vytvořil. Ví někdo jak na to?

 
Nahlásit jako SPAM
IP: 89.203.220.–
12. 1. 2018   #2
-
0
-

Řazení za sebou: od zadané hodnoty odečtu nejbližší menší hodnotu z vyráběné řady. Od zbytku opět odečtu nejbližší menší hodnotu z vyráběné řady ... atd dokud se nedostanu dovnitř pásma hodnot odpovídajícímu zadané toleranci. Tento postup nezvolí vždy nejmenší počet odporů. Lze to zdokonalit tak, že pak bude zkoušet druhou menší, třetí menší ...

Řazení vedle sebe: zde pracuješ s vodivostí, tj. převrácenou hodnotou odporu. Asi je pro tento případ lepší si řadu hodnot odporů převést na řadu hodnot vodivostí. Postup je pak stejný jako pro řazení za sebou, jen odečítáš vodivosti.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
4014 příspěvků
12. 1. 2018   #3
-
0
-

Ok, premyslej, a jak to delas bez programu? Delal jsi to nekdy? ne? tak si to zkus, papir, tuzku a jedem...

[1,2,3,4,5] rada, vymyslena cisla (rezist. rada ma cisla >=1 do <10, jakesi nasoky, nechce se mi ted premyslet)
[5,4,3,2,1] seradis, nejvyssi prvni
R = 126.7 kOhm ... prevedes na exponent
x = 1.267 | y = 100 (nasobitel, rekneme, ze nechci mene nez kOhm)
x - 5 > 0 ? ne
x - 3 > 0 ? ne
x - 2 > 0 ? ne
x - 1 > 0 ? ano, R[] = 1 * y | x = x - 1 = 0.267
posledni cislo v rade
x = x * 10; y = y/10
x = 2.67 | y = 10
x - 5 > 0 ? ne
x - 3 > 0 ? ne
x - 2 > 0 ? ano, R[] = 2 * y; x = x - 2 = 0.67
x - 1 > 0 ? ne
x = x * 10; y = y/10
x = 6.7 | y = 1
x - 5 > 0 ? ano, R[] = 5 * y; x = x - 5 = 1.7
x - 3 > 0 ? ne
x - 2 > 0 ? ne
x - 1 > 0 ? ano, R[] = 1 * y; x = x - 1 = 0.7
y = y/10
y<1 konec
R = 100 + 20 + 5 + 1 kOhm = 126 kOhm

Nahlásit jako SPAM
IP: 2001:718:2601:258:4960:48...–
Matej Rychtarik
~ Anonymní uživatel
2 příspěvky
12. 1. 2018   #4
-
0
-

#3 peter
tohleto dává smysl ale spíš mi šlo o to jak to přepsat do C tak aby to fungovalo což se mi pořád nedaří. Ale i tak díky za radu.

Nahlásit jako SPAM
IP: 89.203.220.–
12. 1. 2018   #5
-
0
-

Řadu hodnot si lze naskládat do pole, možná je šikovné sestupně. Pro zjednodušení použij pole statické inicializované v programu. Pokud chceš skutečné řady hodnot, najdi si nejčastěji používané E12 nebo E24. Toto pole jde procházet cyklem a zkusmo v něm hledat nejbližší menší hodnotu. Mnou popisované odečítání by se provádělo v cyklu, jeho ukončovací podmínka by bylo "je výsledná hodnota v požadované toleranci od požadované?".

Zkus třeba do začátku (jako první krok k řešení) najít v sestupně seřazené řadě hodnot ( = v poli) nejbližší menší hodnotu než dané číslo.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
15. 1. 2018   #6
-
0
-

#5 hlucheucho
no ono to nebude tak snadné a  efektivní skládat to z nejbližších nižších např pokud chci odpor 440 složit z řady E12, tak nejjednodušší je 2x220, pokud bys to hledal po nejbližší tak bys dostal 390+47+2,7= 439,7, v E24 vy to šlo více způsoby např 430+10 nebo 330+110, otázkou je jestli možno kombinovat řady.

Já bych na řady udělal seřazené pole, pokud není hodnota v poli, vzal bych index nejbližší nižší (horní index) a k tomu bych hledal od nejnižších dokud by součet nebyl roven nebo vyšší, když vyšší uložil bych si do pole struktury(nižší hodnotu a oba indexy) snížil bych horní index a pokračoval s hledáním od spodního indexu (tím je vyřešena částečná optimalizace) proces bych opakoval dokud se indexy nesetkají.

Otázkou je zda jít s indexy k sobě nebo od sebe (nalézt nejbližsí index k Hodnota/2) od tam jít nahoru a dolů myslím, že je tam složitější test na ty hranice, v popsaném algoritmu se testuje jen jestli dolní index již není větší než horní, v druhém případě by se muselo testovat zda dolní index nedorazil na začátek a hodnota z horního není větší než požadovaná.

Postup lze použít opakovaně na pole uložených párů jako hledání nové kombinace od požadované se odečte hodnota z horního indexu a hledá se pár pro zbytek který dá trojici.

do 1M by kombinace tří měla vykrýt cca 95% hodnot.

Heh úloha by šla ještě vylepšit o dispoziční množství a počítání sad pro celé schema :D

Nahlásit jako SPAM
IP: 91.139.9.–
peter
~ Anonymní uživatel
4014 příspěvků
15. 1. 2018   #7
-
0
-

Matej Rychtarik - kod za tebe delat nebudu.

MilanL - mas pravdu
Stejny system, serazeno podle nejvetsich a spustit nekolik vetvi naraz, pro kazdou nizsi hodnotu.

e12 = [8.2, 6.8, 5.6, 4.7, 3.9, 3.3, 2.7, 2.2, 1.8, 1.5, 1.2, 1]
440
4.4
Zkusit vsechny moznosti a ktery dava nejpresnejsi cislo na nejmensi pocet prvku.
4.4 = (3.9) + 0.47 + 0.27 ...
4.4 = (3.3) + ...
4.4 = (2.7) + ...
4.4 = (2.2) + ...
Nebo zkusit delit a opet, co nejpresnejsi hodnoty, co nejmensi pocet prvku
4.4/1 = (3.9 + 0.47 + 0.27 ... ) * 1
4.4/2 = (2.2 + ...) * 2
4.4/3 = (0.82 + ...) * 3

Nahlásit jako SPAM
IP: 2001:718:2601:258:58d1:c1...–
15. 1. 2018   #8
-
0
-

#6 MilanL
Kombinovat řady: E12 je podmnožina E24, E6 je podmnožina E12. Jak je to směrem k vyšším řadám jsem nesledoval. 

Jak jsem ve svém příspěvku uvedl, algoritmus nedává jistotu sestavení požadované hodnoty s minimem součástek. Proto jsem navrhl modifikaci s druhou nejbližší, třetí nejbližší... abych zvětšil šanci na sestavení z minima součástek. Pokud chce algoritmus který vždy najde variantu s nejméně součástkami, zřejmě by měl v každém kroku propočítat všechny možné kombinace, tzn. projít všechny menší hodnoty v řadě pro řazení za sebou a všechny větší hodnoty pro řazení vedle sebe.

Dá se to ještě více zkomplikovat možností řadit 3 a více rezistorů sérioparalelně.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
15. 1. 2018   #9
-
0
-

Takže zpátky k úvodní radě: zkusit v poli sestupně seřazených čísel (např. řada E12 sestupně v poli float) najít nejbližší menší nebo rovnou hodnotu (toto je zpřesnění - náhodou to může být zrovna hodnota v řadě) k číslu z intervalu <1,10)

Pak třeba může přemýšlet o tom, jak napasovat 347k na řadu hodnot - tzn. upravit buď požadovanou hodnotu nebo hodnotu v řadě pomocí mocnin 10: nejbližší menší je v E12 330K, ale v řadě je zapsána jako 3,3. Ke všemu by neměl ztratit násobky k, M ...

Po zvládnutí základních věcí si může hrát s optimalizací a pak teprve udělat "třešinku na dortu" - např zohlednit typ rezistorů a tomu odpovídající omezení rozsahů hodnot.

Pro mne se to tváří jako školní úloha, bude stačit zvládnutí základních věcí, a tak na optimalizaci nikdy nedojde.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
16. 1. 2018   #10
-
0
-

#9 hlucheucho
no nevím použití řady <1,10)  se mi zdá o dost složitější - nutnost sledovat exponenty a vše přepočítávat, vzhledem k počtu hodnot v řadě mi pro školní úlohu přijde snazší pracovat s celou řadou, těch hodnot tolik není a dají se vygenerovat z tý zkrácený

Nahlásit jako SPAM
IP: 91.139.9.–
16. 1. 2018   #11
-
0
-

#10 MilanL
1, 10, 100, 1k, 10k,100k, 1M - tj 7x počet hodnot v řadě. Pro E12 je to 84 hodnot, v E24 168. Ano, jde to do pole nadatlit. Možná by si mohl pomoci tím, že si program násobky vygeneruje a do pole uloží sám. Pominul jsem, že uvažovaný typ odporu končí na 4M7. Pokud by měl obsáhnout celý rozsah od drátových rezistorů až po vysokoohmové rezistory... raději ani nemyslet.

Tvoje poznámka však směřuje k dalšímu kroku - jak napasovat celé rozmezí hodnot na řadu. Navzdory jinému přístupu, stále bude potřebovat umět najít nejbližší menší nebo rovnou hodnotu v poli k dané hodnotě.

Zachovám se nepedagogicky, snad ho moc nevyděsím: Ještě chybí zmínka o záludnosti porovnávání dvou float čísel. Pro rovno a nerovno se musí použít pásmo necitlivosti. Pro jeho vytvoření bych použil zadanou toleranci výsledné hodnoty. Zde se pak nabízí hledat nejdříve hodnotu v řadě uvnitř zadané tolerance cílové hodnoty (stačí použít 1 kus odporu) a v případě neúspěchu hledat nejbližší menší (je třeba řadit více odporů za sebou). V každém kroku počítat horní a dolní mez hodnoty pro vkládaný odpor a provádět porovnání stejným způsobem.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
4014 příspěvků
17. 1. 2018   #12
-
0
-

Zkusim to shrnout.
- je mozne radit seriove i paralelne nebo kombinovane, takze odpory muzou byt nahoru i dolu z rady (pokud neni v zadani upresneno)
- je mozne omezit na max pocet odporu (viz zadani)
- je mozna urcita tolerance, nahoru i dolu; takze treba misto 430k se da pouzit 420k i 410k (pokud je zadana nebo je volitelna)

Nevim, kolik z toho ten ucitel uvazoval, ale takhle to vypada slozite :) Co si vzpominam, tak jsme obvykle pouzivali jen ser. jen par. a nebo k par.jsme pridali 1-2 seriove. Vetsinou se stejne pouzivaji 2-3 odpory.
Celkovy slozity programek mozna ani nikdo nikdy nedelal. Ta tolerance obvykle byva dost vysoka, aby nebylo treba.

Nahlásit jako SPAM
IP: 2001:718:2601:258:5031:59...–
MilanL+1
Grafoman
18. 1. 2018   #13
-
0
-

#12 peter
no ta tolerance to dost zjednoduší, myslím že pokud nebude chtít nějaký nesmyslný hodnoty, tak s tolerancí od 2-3% půjde odpory do 10M složit z max 3 kousků v E12 v pohodě. V E6 by to bylo v pohodě s tolerancí 5%+

Nahlásit jako SPAM
IP: 91.139.9.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 67 hostů

Podobná vlákna

Výpočet odporu — založil -.-

Nalezení rekurze — založil sh00ter

Nalezení souborů na disku — založil savek

[C#] Nalezení znaku ve stringu — založil MartiniBaby

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý