Skulle behöva en lösning av följande problem: En fräck gissning Låt... Tackar. Hur skall det realiseras, räknas det ut med dator? Jovisst. Jag tänkte inte använda approximationen, utan lägga in algoritmen i min reglerrutin som styr positioneringen. Det är en servomotor med tillhörande förstärkare. Kanske lika bra att ge härledningen (så den kan kontrolleras): Skulle vara mycket intressant att få höra vad Ni får för resultat på Efter att ha grävt bland mina fragment av minnen av trigonometrikurser kan jag känna igen vissa delar av ditt resonemang. Mina första tester stödjer också att det stämmer. Från <b>Någon som känner sig sugen ?</b> Hej igen. <b>>Kom just på att arc cos väl är definierad mellan 0 och pi. Konstigt att det fungerar med negativa värden.</b> <b>Problemet uppstår när t blir < ca: -354 vilket resulterar i en negativ rotutdragning som ju naturligvis ger fel.</b> <b>Det är minst sagt förvirrande med samma t överallt. Vad är det du vill göra? </b>Lite trigonometri
Givet:
En rätvinlig triangel. Hypotenusan och en katet har fast längd.
Vinkeln mellan hypotenusan och denna katet varierar +- 15 grader.
(Naturligvis är då inte triangeln rätvinklig längre, det är den bara i utgångsläget).
Sökes:
Ett uttryck för längden av den andra kateten (eller benet blir det ju) när vinkeln ändras.
Eftersom ena kateten inte ändras i längd blir det ju inte en enkel tangens.
Någon som känner sig sugen ?Sv: Lite trigonometri
6.7 cm 10 gr 10 cm 15 gr
Sökta kateten = sin(nya vinkeln) * gamla kateten / Sin (gamla vinkeln)
När jag testade 15 gr mot en katet på 10 och
därefter minskade vinkeln till 10 gr blev svaret 6.7 tycker jag låter rimligt.Sv: Lite trigonometri
* a vara den fixa katetens längd,
* b vara den variabla katetens längd i utgångsläget (dvs när triangeln är rätvinklig)
* c vara hypotenusans längd,
* dt vara vinkelns (den mellan kateten och hypotenusan) avvikelse från utgångsläget
Den variabla katetens längd L ges då av
L = sqrt( a^2 + c^2 - 2 a (a cos dt - b sin dt) )
För små dt (troligen funkar det väl i ditt fall) kan vi göra approximationen
cos dt = 1 - dt^2 / 2
sin dt = dt
där dt är given i radianer
Detta ger
L = sqrt( b^2 + 2 a b dt - a^2 dt^2 )
(dt i <b>radianer</b>)
Med dt i <b>grader</b> får vi
L = sqrt( b^2 + pi a b dt / 90 - (a pi dt / 180)^2 )Sv:Lite trigonometri
Noggrannhetskraven är ganska stora, jag skall vrida en bearbetningsenhet med en noggrannhet på 1/100 grad genom en linjär förflyttning.
Den fasta kateten är alltså radien på vridrörelsen (ca 1000mm) och det linjära ställdonet är upphängt i hypotenusans ändpunkt, dvs det linära ställdonet är den variabla kateten.
Jag provar detta, skall bli riktigt intressant.Sv: Lite trigonometri
Om du isf ska ha det noggrannt är det ju bara att strunta i att göra approximationen, bara köra med
L = sqrt( a^2 + c^2 - 2 a (a cos dt - b sin dt) ) Sv:Lite trigonometri
Ville bara förklara lite utförligare vad jag skulle ha det till.Sv:Lite trigonometri
Cosinussatsen säger att
L^2 = a^2 + c^2 - 2 a c cos t
där t är vinkeln mellan kateten och hypotenusan.
I utgångsläget är denna vinkel t0, och vi ändrar den senare till t = t0 + dt.
Det gäller att
c cos t0 = a
c sin t0 = b
(katetrarnas längder i utgångsläget)
Vi får då att
cos t = cos (t0 + dt) = cos t0 cos dt - sin t0 sin dt
enligt räkneregeln för cos av en summa av vinklar.
Detta ger
c cos t = c cos t0 cos dt - c sin t0 sin dt = a cos dt - b sin dt
Insatt i cosinussatsen ger detta
L^2 = a^2 + c^2 - 2 a (a cos dt - b sin dt)
dvs
L = sqrt( a^2 + c^2 - 2 a (a cos dt - b sin dt) )
Okej?Sv: Lite trigonometri
en rätvinklig triangel som har vinkel 15 gr mot en katet som är 10.
Sen ändrar Ni vinkeln till 10 gr med bibehållen hypotenusa.
Vad blir kateten (som var 10) då ?Sv: Lite trigonometri
För att kunna presentera den aktuella positionen för ställdonet skulle jag också ha nytta av det omvända uttrycket, dvs den vinkelavvikelse som motsvarar ett givet L.
Ovan nämnda fragment räcker tyvärr inte till för att vända på detta uttryck.
Tacksam för hjälp med detta.Sv:Lite trigonometri
L^2 = a^2 + c^2 - 2 a c cos t
får vi
2 a c cos t = a^2 + c^2 - L^2
cos t = ( a^2 + c^2 - L^2 )/(2 a c)
dvs
t = arc cos( (a^2 + c^2 - L^2)/(2 a c) )Sv:Lite trigonometri
Roade mig med att skriva en Function i VB som löser din fråga.
Du kan förenkla den avsevärt då du vet den fasta kateten,du vet 15 gr
och du vet den fasta hypotenusan. Dessa kan du ha som Constanter
och behöver bara skicka den nya vinkeln
Ex.Scenario Hypotenusa = 20 Fasta kateten = 19.31851653 Nya vinkeln = 10 gr
då får jag svar 3.493434798 Vad får Ni för svar ?
<code>
Option Explicit
'Tre textboxar: startvinkel , ny vinkel , hypotenusa
' sAngle nAngle hypo
Private Sub Command1_Click()
Dim arg1 As Double
Dim arg2 As Double
Dim arg3 As Double
Dim retValue As Double
'Obs punkt (.) som decimalavskiljare
arg1 = DegToRad(Val(Text1.Text)) ' Startvinkel i ditt fall 15 gr
arg2 = DegToRad(Val(Text2.Text)) ' Nya vinkeln
arg3 = Val(Text3.Text) ' Den fasta hypotenusan
retValue = aKatet(arg1, arg2, arg3)
MsgBox retValue
End Sub
Private Function aKatet(ByVal sAngle As Double, _
ByVal nAngle As Double, _
ByVal hypo As Double) As Double
Dim BC As Double 'jag kallar hypotenusan c
Dim nAC As Double
'steg 1 ta reda på katet BC din fasta katet
'Dvs du kan hoppa över detta steg,ersätta med Constant
BC = Cos(sAngle) * hypo
'steg 2 ta reda på katet nya AC
nAC = hypo - Cos(nAngle) * BC
'steg 3 ta reda på sökta katet
aKatet = Sqr((Sin(nAngle) * BC) ^ 2 + nAC ^ 2)
End Function
Function DegToRad(ByVal Degree As Single) As Single
DegToRad = Degree * 0.0174533 '3.141593 / 180
End Function
</code>Sv: Lite trigonometri
Har ett problem jag inte riktigt greppar.
arc cos finns ju inte i vb varför jag ersatt det med följande:
t = Atn(-t / Sqr(-t * t + 1)) + 2 * Atn(1)
Problemet uppstår när t blir < ca: -354 vilket resulterar i en negativ rotutdragning som ju naturligvis ger fel.
Detta motsvarar dock endast ca: -14 grader vilket väl ligger inom definitionsområdet för arc cos (-pi/2 till pi/2). Tacksam för resonemang kring detta.
/PeO
EDIT:
Kom just på att arc cos väl är definierad mellan 0 och pi. Konstigt att det fungerar med negativa värden.
Som sagt tacksam för resonemang om detta.Sv:Lite trigonometri
arc cos x är precis som du skriver definierad för x i [0, pi].
Men sen förstår jag inte riktigt detta:
t = Atn(-t / Sqr(-t * t + 1)) + 2 * Atn(1)
Det är minst sagt förvirrande med samma t överallt. Vad är det du vill göra?
Har du allt i radianer?Sv:Lite trigonometri
Du kan inte få negativt under roten eftersom t (på högersidan) inte får vara större än 1. Däremot kan du få division med 0 (om t=1), men det fallet bör du specialbehandla innan du kommer till uttrycket.Sv: Lite trigonometri
Sorry, det blev ett t för mycket. Vänster led skall vara x.
Jag vill ha arc cos(t) som inte finns i vb, därför detta med arc tan.
Det föll dessuotm bort en rad som ju gjorde det hela ännu obegripligare, nämligen det uttryck som Per gett mig ovan. Det är min variabel in i det uttrycket som har värdet -355 när det blir fel.
Då närmar sig t mycket riktigt 1 och en division med 0 uppstår.
Du har (som vanligt) helt rätt Per.
Tackar för hjälpen och ber om ursäkt för mitt slarv vid förra inlägget.