2017-05-11 7 views
0

我想用C++找到一個具有簡單定點方法的根,但問題是Xrf(x)的一個根,也是一個拐點。另外,A方程比正常的定點方法稍微複雜一些。 該方程式增加了常數c以檢查多快地收斂到根xr。使用定點方法找到根的兩個必需條件

我打算找到一個根,然後檢查根是否是一個拐點,但它不工作,我在代碼中找不到問題。 我需要你的幫助。

真正的問題是

考慮求根問題f(x)=0與根xr,其中f '(x)=0。 將其轉換爲簡單的定點問題。

x=x+c*f(x)=g(x) 

其中c爲非零常數。應該如何C是選擇以確保c

x(n+1)=x(n)+c*f(x(n)) (x(n+1) means the value of the n+1th of X) 

快速收斂(前提是x0選擇足夠接近XR?)。將您選擇c的方式應用於找到問題x*x*x-5=0。與x0=1.0啓動程序,並以c的幾個值運行,並約在搜索結果中所觀察到的趨勢(換句話說,C值的收斂行爲的影響)

#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
#include <stdlib.h> 

double gx(double x, double c) 
{ 
    return(x + c*(x*x*x - 5)); 
} 

double gxpr(double x, double c) 
{ 
    return(x + c*(3 * x*x)); 
} 

void Simple_Fixed_Point(double x, double c) 
{ 
    int i = 1; 
    long double x2=0.0; 
    long double x3=0.0; 
    long double ea=0.0; 
    long double ea2 = 0.0; 
    long double es = pow(10, -6); 

    printf("Simple Fixed Point Method\n"); 

    Lbl: 
     x2 = gx(x,c); 

      printf("iteration=%d Root=%.5f Approximate error=%.15f\n", i++, 
x2, ea); 

     if (ea=fabs((x2 - x)/x2*100) <es) 
     { 
      goto Lbm; 
     } 
     else 
     { 
      x = x2; 
      goto Lbl; 
     } 

    Lbm: 
     x3 = gxpr(x2, c); 

     if (ea2 = fabs((x3 - x2)/x3 * 100) < es) 
     { 
      goto End; 
     } 
     else 
     { 
      x2 = x3; 
      goto Lbm; 
     } 

    End: 
     getch(); 
} 

int main(void) 
{ 
    Simple_Fixed_Point(1.0, 1.0); 

    return(0); 
} 
+0

函數f(x)= x^3-5'f'(x)= 3x^2'在x = 0處有一個拐點,但它不是'f'的根, 。你是不是指'f(x)=(x-5)^ 3'? – LutzL

+0

請更改您的C++代碼,使其在沒有'goto'語句的情況下工作。請解釋函數'gxpr'扮演的角色,因爲任務沒有提供關於迭代的任何信息'xnext = x + c * f'(x)' – LutzL

+0

Goto很棒。忽略上面的帖子。 – AppWriter

回答

0

希望討論這可以幫助你:

//f(x+dx) = f(x) + (dfdx) * dx; 
eps = 1.0;  
dx = 1e-7; //something small 
x = x0; 
while (eps > mineps) { 
    f1 = f(x); 
    f2 = f(x + dx);  
    f3 = f(x + dx + dx);   
    d2fdx2 = (f3 - f2 - f2 + f1)/dx/dx; 
    dfdx = (f2 - f1)/dx; 
    x -= (relax1 * f1/dfdx + relax2 * dfdx/d2fdx2); //relax - something less 1 
    eps = max(abs(dfdx), abs(f1)); 
} 
相關問題