2009-10-16 3 views
-2

x, (1 + x)^4 = 34.5에 대해이 방정식을 해결하십시오. 나는 당신이 사용할 수학 라이브러리에 관심이 있습니다. C에서 같은 것을 해결 방정식 훨씬 간단C++/C에서 x에 대한이 수학 방정식을 어떻게 풀 수 있습니까?

(1 + X)^4 = 34.5

감사

+10

문제를 설명 할 때 * 많이 * 더 잘해야합니다. 그 방정식의 해답을 찾고 있다면 펜과 종이를 사용하십시오! 당신이 도서관 상태를 요구한다면! – sellibitze

답변

5

대략의 X * (X + A)^B = C

당신은 더 복잡한 다항식에 대한보다 강력한 솔루션을 필요로 하겠지만,이 숙제를 끝내지 충분 될 수 있습니다.

이 알고리즘은 Newton's Method을 사용하며 Ruby로 작성되었습니다. wolfram|alpha을 사용하여 미분과 해답이 올바른지 확인할 수 있습니다.

def f(x,a,b,c) 
return x*(x+a)**b-c 
end 

def df(x,a,b,c) 
return (x+a)**b+b*x*(x+a)**(b-1) 
end 

def newton(a,b,c) 
xn=0 #initial seed for Newton's method 

while true 
    xn2=xn-f(xn,a,b,c)/df(xn,a,b,c) #Newton's method 
    print "f(%.5f)=%.5f\n"%[xn,f(xn,a,b,c)] 
    break if (xn2*10000).to_i==(xn*10000).to_i #set desired precision here 
    xn=xn2 
end 
print "root is %.5f"%[xn2] 
end 

newton(1,4,34.5) 

이 생성 :

f(0.00000)=-34.50000 
f(34.50000)=54793902.65625 
f(27.44093)=17954483.09402 
f(21.79391)=5883122.74717 
f(17.27661)=1927672.51373 
f(13.66318)=631598.66717 
f(10.77301)=206926.07160 
f(8.46171)=67782.26596 
f(6.61400)=22194.34671 
f(5.13819)=7259.61867 
f(3.96214)=2367.67791 
f(3.03097)=765.73665 
f(2.30728)=241.54928 
f(1.77466)=70.68568 
f(1.43951)=16.48341 
f(1.30101)=1.97186 
f(1.27945)=0.04145 
f(1.27897)=0.00002 
root is 1.27897 
+0

wolfram 알파에 멋진 일, 그리고 시원한 링크 – jrhicks

+0

끔찍한, 아무도 여기 파이썬을 말하지 않는다 ... – vehomzzz

+6

it 's Ruby , 안드레이. – avguchenko

2

손으로 그것을 해결 다르지 될 수 없습니다; 상징적 인 수학 (Mathematica?)에 더 적합한 시스템을 사용하는 것이 더 쉽습니다. A similar question 최근에 물었다.

+0

나는 이것을 놓쳤다. 나는 다른 CAS 라이브러리에 대한 언급이 있음을 알았다. – MaD70

3

당신은 숫자로 의미를 해결합니까? Newton–Raphson 구현이 간단하기 때문에 "math.h"와 함께 C 런타임을 사용합니다. 사실, 허용 가능한 오류 크기, 성능 등과 같은 요구 사항을 명시해야합니다. 그러면 라이브러리 선택이 축소됩니다.

5

"해결"의 의미에 달려 있습니다.

"이 기계의 부동 소수점 정확도의 한계에 대한 방정식을 만족하는 double x의 값을 찾으십시오"라는 의미라면 Luiscencio의 접근 방식이 좋습니다.

"x가 주어진 방정식을 만족시키는 'x ='형태의 방정식을 찾으면"(AKA "대수적으로 해결") C 나 C++ 모두 도움이되는 라이브러리가 없습니다. Carl이 언급했듯이 손으로 직접 계산하거나 Mathematica 또는 비슷한 상징적 인 수학 패키지를 사용해야합니다.

그 중 하나와 다른 의미가있는 경우 다시 질문하십시오.

+0

당신은 자신과 모순됩니다. "C 나 C++도 도움이되는 라이브러리가 없습니다." -> "또는 유사한 기호 수학 패키지"를 사용하십시오. 프로그래밍 방식으로 수행해야하는 경우 후자가 정답입니다. – rmeador

+0

일반적으로 이러한 "유사한 상징적 인 수학 패키지"는 c/C++ 라이브러리가 아닙니다. 그것들은 독립 실행 형 응용 프로그램입니다. – Alan

+0

앨런은 내가 의미하는 바를 정확하게 설명했습니다. 언어의 일부인 소위 "수학 라이브러리"는 대개 산술 및 제곱근, 로그, 삼각 함수 등과 같은 다양한 기능에 실제로 사용됩니다. 상징적 인 해결은 일반적으로 지원되지 않는다. (나는 결코 말하지 않을 것이다. 그러나 누군가 이상한 학업 언어로 나를 틀리게 증명할 것임) – Berry

4

I는 다른 응답 이후 용액 방정식의 사소한 재 배열되기 때문에이 문제는 대폭 변경되었음을 가정하고 :

X = 34.5가^(1/4) - 코드 1

:

double x = pow(34.5, 1.0/4.0) - 1 ; 
+5

일반적으로 솔루션을 잃어 버릴 수 있기 때문에 변수가 포함 된 요소의 뿌리를 가져 오는 것은 바람직하지 않습니다. 이 특정 예에서 다항식은 두 개의 해를 가졌지 만 메서드는 단 하나만 찾습니다. – avguchenko

+2

@avguchenko : 그것에 대해 솔직하게 말하면 두 가지 실제 솔루션과 두 가지 복잡한 솔루션이 있습니다. – Pillsy

+0

동의. 질문 (아마 편집 후)은 질문이 '훨씬 더 간단하다'고 말합니다 (단지 외쳤습니다). 내가 궁금해하는 것보다 훨씬 간단 해? 그리고 왜 지금은 훨씬 더 간단합니까? 이것은 '훨씬 더 단순한'대답입니다.) – Clifford

1

이것은 더 간단한 기능입니다. 그것은 또한 우리가 모든 뿌리를 찾을 수 있도록 여러 가지 씨앗을 가지고 있습니다.

# solve (x+a)^b=c 
def f(x,a,b,c) 
    return (x+a)**b-c 
end 

def df(x,a,b,c) 
    return b*(x+a)**(b-1) 
end 

def newton(a,b,c) 
    roots=[] 
    for seed in [-100000, -100, -1,1,100, 100000] # set initial guesses here 
    print "\n with seed %d\n"%[seed] 
    root=newton_root(seed,a,b,c) 
    if root and not roots.include?(root) 
     roots << root 
    end 
    end 
    return roots 
end 

def newton_root(xn,a,b,c) 
    while true 
    if (df(xn,a,b,c)).abs<0.000001 # give up with this seed if derivative is too low 
     print " gave up on this seed\n" 
     return nil 
    end 

    xn2=xn-f(xn,a,b,c)/df(xn,a,b,c)  
    # print " f(%.5f)=%.5f\n"%[xn,f(xn,a,b,c), xn2]  

    if (xn2*10000).to_i==(xn*10000).to_i # set precision here 
     rounded_xn=(xn2*10000).to_i/10000.0 
     print "  found root %0.5f\n"%[rounded_xn] 
     return rounded_xn 
    else 
     xn=xn2 
    end 
    end 
end 


print newton(1,4,34.5).inspect 

이 생성 :

with seed -100000 
    found root -3.42350 

with seed -100 
    found root -3.42350 

with seed -1 
gave up on this seed 

with seed 1 
    found root 1.42350 

with seed 100 
    found root 1.42350 

with seed 100000 
    found root 1.42350 

[-3.4235, 1.4235]

1

X1 = 34.(5)^(1/4) - 1
X2 = -34.5^(1/4) - 1

// #INCLUDE < math.h>
이중 X1 = SQRT (SQRT (34.5)) - 1 ;
double x2 = -sqrt (sqrt (34.5)) - 1;

+0

그것들은 두 가지 실제 해결책이지만 거기에도 복잡한 공액이 있습니다. – duffymo

1

(1 + X)^4 = 34.5

(1 + X)^2 = SQRT (34.5) = +/- 5.87367

1 + X = SQRT (SQRT (34.5)) = +/-

X = 1.423557 2.42357 X = -3.42357

을 확인

01 다른 사람이 언급했듯이 23,516,

(1 + 1.423557)^4 = 34.4995

(1 + -3.42357)^4 = 34.500이

+0

-1 + 2.42357i 및 -1 - 2.42357i – mob

+0

네 번째 루트를 찾는 더 간단하고 직접적인 방법은 pow (34.5, 0.25) – Clifford

2

( 체크) ( 체크), 당신의 질문은 명확하지 않습니다. 상징적으로

    수치
  1. 또는
  2. : 프로그래밍 방정식을 해결하는 방법은 두 가지가 있습니다.

첫 번째 종류의 방법은 numerical analysis입니다.

두 번째 종류의 방법은 Computer Algebra Systems (CAS)라고하는 소프트웨어 용으로 개발되었습니다. 이 목적으로 개발 된 C++에는 하나 이상의 라이브러리가 있습니다 (GiNaC).

또한 Carl Norummentioned으로, similar question은 최근에 다른 CAS 라이브러리가 답변에 인용되어 있는지 묻습니다.

+0

중 하나입니다 ... – Jimmy

+0

나는 벌었습니다. 몇 가지 명성 때문에 이제 할 수 있습니다. 어쨌든 감사하고 배지에 감사드립니다. – MaD70

관련 문제