a t + b sin( c t ) = d 의 해를 어떻게 구할까요?

Hyun의 이미지

막대의 무게중심이 등속운동을 하고 있고 일정한 각속도로 회전하고 있을 때, 이 막대가 일정 거리만큼 떨어진 벽면과 부딪히는 시간을 구하려고 합니다. 결론은 다음의 관계식으로 유도되는 듯 한데,
at + bsin( ct ) = d
a, b, c, d 가 상수이고 t 가 변수일 때 위 식을 만족하는 t의 일반 해를 구할 수 있을까요?

seoleda의 이미지

sin 함수를 2차항까지 테일러 전개한 다음에 3차 방정식을 풀어서,

실수해만 취하면 가능할 것 같은데요.

(사실 복소수가 나오면 어떻게 해석해야 하는지 잘 모르겠습니다. ㅎㅎ )

그런데, 테일러 전개를 하면 오차가 생기고 t값에 비례해서 커지니,

다음과 같이 2단계로 나눠서 풀면 어떨까 합니다.

1. 막대의 가장 긴 지름 r을 구한 후,

벽면에 닫기 직전까지의 시간 t+r = d 를 이용하여 벽면에 닿기 직전까지의 해를 구한다.

2. 구해진 t를 이용해서 막대의 현재 각을 구하고,

원 방정식을 변형해서, sin 함수를 테일러 전개해서 푼다.~

다시 생각해보니 솔루션이 썩 좋아 보이지는 않습니다.

아무튼 재미있는거 하시네요.

좋은 방법을 찾으면 알려주세요 ㅎㅎ

esrevinu의 이미지

at + b |sin ct| = d 가 아닐런지요?

altromondo의 이미지

길이 2r인 막대의 무게 중심이 벽면에 수직한 방향으로만
운동(처음 거리는 D, 접근 속도는 v)한다고 가정하고,
회전 각속도를 w, 막대와 벽면 사이 초기각을 0로 두면...

D - (vt + r|sin(wt)|) = 0

막대의 임의의 끝 부분과 벽면 사이의 거리는 위와 같이 주어집니다.
'임의의 한 끝'이 되어야 하므로 |sin(wt)|가 맞지요.
아무튼 이건 wt가 매우 작지 않으면
(즉 막대가 찔끔 돌아가기도 전에 벽에 닿지 않으면)
수치해만 구할 수 있는 비선형 방정식입니다. 혹시 이런 거..
수치해석 첫 시간에 첫 예제로 다루는 녀석 아닌가요?
(배운 지가 10년도 넘었는데 왠지 아직도 낯설지 않아서요;; -_-;; )

snowall의 이미지

at + bsin( ct ) = d

p=-a/cb, k=d/b, c*t = x
로 놓고서 적당히 고쳐보면
sin(x) = p*x + q
p, q은 상수
로 바꿀 수 있을 것 같습니다.

근데 아무튼 이건 Transcendental equation이라서 일반해는 못구할것 같네요 --;;

--------------------------
피할 수 있을때 즐겨라!
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

dl3zp3의 이미지

해를 식으로 딱 표현하기는 불가능한 것 같구요 이 경우는 그냥 numerical analysis 쪽으로 방향을 트는 게 좋을 것입니다.

guybrush1의 이미지

간단하게 newton's method 쓰면 될 것 같네요.

흠.. 다시보니 sine 함수라서 좀 힘들라나요;

inhosens의 이미지

범위를 좁혀서 생각해 보시면 쉬워지지 않을까 싶습니다.

고등학생들은 잘 풀 것 같은데 전 졸업한지 오래 되서 공식이 기억이 안나는 군요. ;;

대충 연속인 함수들의 합이므로 미분 가능할 것 같고 미분하면

a + bc*cos(ct) = 0

ct = acos(-a/bc)

t = 1/c * acos(-a/bc) 정도가 되는거 아닌가 싶습니다만.. 제대로 된 건지 여전히 가물가물합니다. ;;

Hyun의 이미지

f(x) = 0 을 만족하는 x 에 대해 그 미분방정식인 f '(x) = 0 을 항상 만족하지 않는 것 같습니다.
sin( x ) = 0 의 해 x = 0 에 대해 f( x ) 의 미분함수인 cos( x ) = 0 은 만족하지 않는 것 처럼요.


나도 세벌식을 씁니다
inhosens의 이미지

그렇네요. 엔지니어링이 수학의 연장선이라고 하는데 요즘은 수학이라는게 기억이 안나는군요 -_-;

endofhope의 이미지

일반 해는 아니지만 값만 찾아내려 한다면,
sin 의 절대값이 1 이하라는 것을 이용해서 t의 해가 존재하는 영역을 한정한 다음 찾을 수 있을 것 같습니다.

a t + b sin(ct) = d
b sin(ct) = d - at
sin(ct) = (d - at) / b
therefore, |(d-at)/ b| <= 1
-1 <= (d - at)/b <= 1
if b>0
-b <= d - at <= b
-b + d <= at <= b + d
if a>0
(-b + d)/a <= t <= (b + d)/a

여기서 f(t) = at + bsin(ct) -d 라고 하고
N 개로 잘라내서 f(t) 의 부호가 바뀌는 걸 확인한다면,
전체 길이가 (b + d)/a - (-b + d)/a = 2b /a
따라서 단위 t 의 길이는 ( 2b / a )/N

java code

import java.lang.Math;
 
public class Calc{
    public static void main(String[] args){
	double a = 1.0;
	double b = 1.0;
	double c = 1.0;
	double d = 1.0;
	int unitCnt = 100;
 
	double leftT = (d-b)/a;
	double rightT = (d+b)/a;
	double unitSize = (2*b/a)/unitCnt;
	double[] tArray = new double[unitCnt+1];
	for(int i=0; i<=unitCnt; i++){
	    tArray[i] = leftT + i*unitSize;
	}
	System.out.printf("a %f b %f c %f d %f \n", a, b, c, d);
	for(int i=0; i<=unitCnt; i++){
	    double t = tArray[i];
	    System.out.printf(" F(%f)= %f\n", t, getY(a, b, c, d, t));
	}
    }
    private static double getY(double a, double b, double c, double d, double t){
	return (a * t + b * Math.sin(c*t) - d);
    }
}

몇몇 결과
(a, b, c, d) = (1, 1, 1, 1) 이고 N 이 10 이라면

a 1.000000 b 1.000000 c 1.000000 d 1.000000
F(0.000000)= -1.000000
F(0.200000)= -0.601331
F(0.400000)= -0.210582
F(0.600000)= 0.164642
F(0.800000)= 0.517356
F(1.000000)= 0.841471
F(1.200000)= 1.132039
F(1.400000)= 1.385450
F(1.600000)= 1.599574
F(1.800000)= 1.773848
F(2.000000)= 1.909297

따라서 대충 0.4 ~ 0.6 사이에 있을 것으로 보입니다.

좀 더 정확히 하기 위해 N 을 100 으로 했더니
... 생략
F(0.480000)= -0.058221
F(0.500000)= -0.020574
F(0.520000)= 0.016880
F(0.540000)= 0.054136
... 생략

고로 대충 0.5xx 정도네요.

하나 더,
(a, b, c, d) = (1, 2, 3, 4) 이고 N 이 20 이라면
a 1.000000 b 2.000000 c 3.000000 d 4.000000
F(2.000000)= -2.558831
F(2.200000)= -1.176917
F(2.400000)= -0.012664
F(2.600000)= 0.597087
F(2.800000)= 0.509198
F(3.000000)= -0.175763
F(3.200000)= -1.148654
F(3.400000)= -1.999749
F(3.600000)= -2.361872
F(3.800000)= -2.038657
F(4.000000)= -1.073146
F(4.200000)= 0.267246
F(4.400000)= 1.584147
F(4.600000)= 2.487391
F(4.800000)= 2.731316
F(5.000000)= 2.300576
F(5.200000)= 1.415507
F(5.400000)= 0.455156
F(5.600000)= -0.175134
F(5.800000)= -0.185319
F(6.000000)= 0.498026

이건 대충 2.4~2.5 와 2.8 ~ 3.0, 그리고 4.0 ~ 4.2, 5.4 ~ 5.6, 5.8 ~ 6.0 사이.
이정도로 때려 맞출 수 있겠네요.

--
말할 수 있는 것은 분명하게 말해질 수 있다;
말해질 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

--
말할 수 있는 것은 분명하게 말해질 수 있다;
말해질 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

나그네나그네의 이미지

무작정 풀려고 덤벼드는 것보단 일단

at + bsin( ct ) = d

=>

(a/c) y + bsiny = d'
(y = ct, 0 <= y <= 2pi)

로 바운더리를 놓고 시작하는 것이 좋을 것 같군요.

충분히 막대기가 벽과 가까워져서, 이번 회전에 반드시 부딪힐 때의 y값을 구하면 t값도 구할수 있겠네요.(물론 그 전까지 몇 번 회전했는지도 계산해야할듯..)

esrevinu의 이미지

Mathematica :

In[7]:= Solve[a t + b Abs[Sin[c t]] == d, t]
 
Solve::tdep: The equations appear to involve the variables to be solved for in
    an essentially non-algebraic way.
 
Out[7]= Solve[t + Abs[Sin[t]] == 10, t]
 
In[8]:= NSolve[t + Abs[Sin[t]] == 10, t]
 
InverseFunction::ifun: 
   Inverse functions are being used. Values may be lost for multivalued
    inverses.
 
Solve::tdep: The equations appear to involve the variables to be solved for in
    an essentially non-algebraic way.
 
Out[8]= NSolve[t + Abs[Sin[t]] == 10, t]
 
In[36]:= a = 1; b = 1; c = 1; d = 10;
 
In[37]:= FindRoot[a t + b Abs[Sin[c t]] == d, {t, 0}]
 
Out[37]= {t -> 9.71441}
 
In[38]:= a = 1; b = 1; c = 1; d = 1;
 
In[39]:= FindRoot[a t + b Abs[Sin[c t]] == d, {t, 0}]
 
Out[39]= {t -> 0.510973}
 
In[40]:= a = 1; b = 2; c = 3; d = 4;
 
In[41]:= FindRoot[a t + b Abs[Sin[c t]] == d, {t, 0}]
 
Out[41]= {t -> 2.95914}