2017-03-14 7 views
0

영어로 죄송합니다. 모국어가 아닙니다. 방정식과 비선형 시스템의 수치 분해능에 대한 Newton-Raphson 알고리즘을 만들려고합니다.Maxima diff : 변수가 숫자가 아니어야합니다. 찾았습니다 : 1

나는 창 (10)을 가지고 있고 최대 14.12.1.This 내 알고리즘 :

NR(f,a,tol,n):=block(
define(k(x),diff(f(x),x)), 
for i:1 thru n do(
    b : a - f(a)/k(a), 
    if abs(b-a)<tol then 
     return (float(b)) 
    else 
     a:b 
),return (float(a)) 

); 난이 기능에 평가를 할 때

는 :

diff: variable must not be a number; found: 1 
#0: k(x=1) 
#1: NR(f=-1/8^x+3*x/4^x-3*x^2/2^x+x^3,a=1,tol=1/1000000,n=100) 
-- an error. To debug this try: debugmode(true); 

내가이 error.Please이 모두 나와 덕분에 도움을 해결할 수있는 방법을 잘 모릅니다 :

g(x) :=x^3 -(3*x^2)*2^(-x)+3*x*4^(-x)-8^(-x); 
NR(g(x),1,10^(-6),100); 

나는이 오류 .

답변

1

여기에서 해결해야 할 두 가지 사항. (1) g은 함수의 이름이고 g(x)은 표현식입니다 (즉, x에서 계산 된 결과 임). NR의 정의가 주어지면 NR(g(x), ...) 대신 NR(g, ...)을 쓸 수 있습니다. (2) Maxima는 정확하지 않은 수 (정수 또는 합리적인 수)를 부정확 (float 및 bigfloat)하는 것을 선호합니다. 루프 내에서 중간 결과를 인쇄하면 blog(4)log(8)과 같이 큰 더러워진 식으로 변하고 있음을 알 수 있습니다. float으로 감싸서 단일 부동 소수점 숫자로 평가하십시오.

다음은 개정판입니다.

NR(f,a,tol,n):=block(define(k(x),diff(f(x),x)), 
for i thru n do 
    (b:float(a-f(a)/k(a)), 
    printf(true,"iteration ~d, a=~a, b=~a, (b - a)=~a~%",i,a,b,b-a), 
    if abs(b-a) < tol then return(float(b)) 
    else a:b),return(float(a)))$ 

다음은 위 버전의 예입니다.

(%i22) NR(g, 1, 10^(-6), 100); 
iteration 1, a=1, b=0.8762290691947893, (b - a)=-0.1237709308052107 
iteration 2, a=0.8762290691947893, b=0.7960328661177172, (b - a)=-0.08019620307707209 
iteration 3, a=0.7960328661177172, b=0.7435978033304336, (b - a)=-0.0524350627872836 
iteration 4, a=0.7435978033304336, b=0.7090971628901521, (b - a)=-0.03450064044028145 
iteration 5, a=0.7090971628901521, b=0.6862988635291022, (b - a)=-0.02279829936104993 
iteration 6, a=0.6862988635291022, b=0.6711896281138916, (b - a)=-0.01510923541521059 
iteration 7, a=0.6711896281138916, b=0.6611565733873623, (b - a)=-0.01003305472652927 
iteration 8, a=0.6611565733873623, b=0.6544855241390547, (b - a)=-0.006671049248307637 
iteration 9, a=0.6544855241390547, b=0.6500459976322316, (b - a)=-0.00443952650682311 
iteration 10, a=0.6500459976322316, b=0.6470897956059268, (b - a)=-0.002956202026304755 
iteration 11, a=0.6470897956059268, b=0.6451205413528185, (b - a)=-0.001969254253108343 
iteration 12, a=0.6451205413528185, b=0.6438083926046423, (b - a)=-0.001312148748176201 
iteration 13, a=0.6438083926046423, b=0.6429339322360853, (b - a)=-8.744603685569841E-4 
iteration 14, a=0.6429339322360853, b=0.6423510944072349, (b - a)=-5.828378288503799E-4 
iteration 15, a=0.6423510944072349, b=0.6419625961778163, (b - a)=-3.884982294186656E-4 
iteration 16, a=0.6419625961778163, b=0.6417036241811079, (b - a)=-2.589719967083237E-4 
iteration 17, a=0.6417036241811079, b=0.6415309880468466, (b - a)=-1.726361342613281E-4 
iteration 18, a=0.6415309880468466, b=0.6414159027268955, (b - a)=-1.150853199510804E-4 
iteration 19, a=0.6414159027268955, b=0.6413391816804196, (b - a)=-7.672104647593603E-5 
iteration 20, a=0.6413391816804196, b=0.6412880347133941, (b - a)=-5.114696702546162E-5 
iteration 21, a=0.6412880347133941, b=0.6412539385204955, (b - a)=-3.409619289862498E-5 
iteration 22, a=0.6412539385204955, b=0.6412312089557869, (b - a)=-2.272956470861232E-5 
iteration 23, a=0.6412312089557869, b=0.6412160535014019, (b - a)=-1.515545438501853E-5 
iteration 24, a=0.6412160535014019, b=0.6412059475250002, (b - a)=-1.010597640171973E-5 
iteration 25, a=0.6412059475250002, b=0.6411992383365198, (b - a)=-6.709188480336081E-6 
iteration 26, a=0.6411992383365198, b=0.6411946523270589, (b - a)=-4.586009460960661E-6 
iteration 27, a=0.6411946523270589, b=0.6411918666867252, (b - a)=-2.785640333624606E-6 
iteration 28, a=0.6411918666867252, b=0.6411902285428732, (b - a)=-1.638143852011886E-6 
iteration 29, a=0.6411902285428732, b=0.6411883963195618, (b - a)=-1.832223311404313E-6 
iteration 30, a=0.6411883963195618, b=0.6411901425747176, (b - a)=1.746255155810061E-6 
iteration 31, a=0.6411901425747176, b=0.6411885554504851, (b - a)=-1.587124232482751E-6 
iteration 32, a=0.6411885554504851, b=0.6411862242380371, (b - a)=-2.33121244808121E-6 
iteration 33, a=0.6411862242380371, b=0.6412129051345152, (b - a)=2.668089647817062E-5 
iteration 34, a=0.6412129051345152, b=0.6412038661598046, (b - a)=-9.038974710606773E-6 
iteration 35, a=0.6412038661598046, b=0.6411978270328432, (b - a)=-6.039126961399077E-6 
iteration 36, a=0.6411978270328432, b=0.641193747387054, (b - a)=-4.079645789190067E-6 
iteration 37, a=0.641193747387054, b=0.6411909672221692, (b - a)=-2.780164884863545E-6 
iteration 38, a=0.6411909672221692, b=0.641189166438378, (b - a)=-1.80078379119486E-6 
iteration 39, a=0.641189166438378, b=0.6411875933891164, (b - a)=-1.573049261627268E-6 
iteration 40, a=0.6411875933891164, b=0.6411875933891164, (b - a)=0.0 
(%o22)      0.6411875933891164 
+0

감사합니다. 귀하의 개정 내용을 이해합니다. :) – krithass