2012-04-04 85 views
-4

嘿,我试图编写一个程序来执行牛顿方法,并找到方程exp(-x) - (x^2)+3的根。它的工作原理是找到根,但我也希望它在每次迭代后都打印出根,但是我无法使它工作,任何人都可以指出我的错误,我认为它与我的索引有关?用指针索引C/C++

太感谢了:)

#include <stdio.h> 
#include <math.h> 
#include <malloc.h> 

//Define Functions: 
double evalf(double x) 
{ 
     double answer=exp(-x)-(x*x)+3; 
     return(answer); 
} 
double evalfprime(double x) 
{ 
     double answer=-exp(-x)-2*x; 
     return(answer); 
} 
double *newton(double initialrt,double accuracy,double *data) 
{ 
     double root[102]; 
     data=root; 
     int maxit = 0; 
     root[0] = initialrt; 
     for (int i=1;i<102;i++) 
     { 
       *(data+i)=*(data+i-1)-evalf(*(data+i-1))/evalfprime(*(data+i-1)); 
       if(fabs(*(data+i)-*(data+i-1))<accuracy) 
       { 
         maxit=i; 
         break; 
       } 
       maxit=i; 
     } 

     if((maxit+1==102)&&(fabs(*(data+maxit)-*(data+maxit-1))>accuracy)) 
     { 
       printf("\nMax iteration reached, method terminated"); 
     }  
     else 
     { 
       printf("\nMethod successful"); 
       printf("\nNumber of iterations: %d\nRoot Estimate: %lf\n",maxit+1,*(data+maxit)); 
     } 

     return(data); 
} 




int main() 
{ 
    double root,accuracy; 
    double *data=(double*)malloc(sizeof(double)*102); 

    printf("NEWTONS METHOD PROGRAMME:\nEquation: f(x)=exp(-x)-x^2+3=0\nMax No iterations=100\n\nEnter initial root estimate\n>> "); 
    scanf("%lf",&root); 
    _flushall(); 
    printf("\nEnter accuracy required:\n>>"); 
    scanf("%lf",&accuracy); 
    *data= *newton(root,accuracy,data); 
    printf("Iteration  Root   Error\n "); 
    printf("%d   %lf    \n", 0,*(data)); 
    for(int i=1;i<102;i++) 
    { 
     printf("%d    %5.5lf   %5.5lf\n", i,*(data+i),*(data+i)-*(data+i-1)); 
     if(*(data+i*sizeof(double))-*(data+i*sizeof(double)-1)==0) 
     { 
      break; 
     } 
    } 
    getchar(); 
    getchar(); 
    free(data); 
    return(0); 
} 
+2

如何赫克这个问题是有关它的标题?! – valdo 2012-04-04 10:34:29

+0

它以什么方式不起作用? – JeremyP 2012-04-04 10:39:38

+0

,因为我确定我的问题是与指数编入我的数组 – Leavenotrace 2012-04-04 10:40:06

回答

1

没有犯罪,但你的问题是非常养眼downvoting。无关的问题标题,荒谬的编码风格(我的意思是制表)。

同样在你的newton函数中,并不需要存储所有的中间结果,Newton-Raphson不应该使用额外的内存(即它是O(1))。

只需在迭代循环内的newton内添加printf即可。这是一个问题吗?

+0

对不起,我不是故意做广告的问题。我只有2个月的编码,所以我的风格并不好。 – Leavenotrace 2012-04-04 10:49:46

1

newton中,返回函数返回后不再存在的局部变量的地址。之后访问它是未定义的行为。

main你有

if(*(data+i*sizeof(double))-*(data+i*sizeof(double)-1)==0) 

datadouble*,所以data + i地址的第i个double从一开始。通过将偏移量乘以sizeof(double),您可以访问超出数组末尾的数据,如果i > number_of_elements/sizeof(double)还有更多未定义的行为。

而且,你打电话感谢JeremyP寻找它,在mainnewton

*data= *newton(root,accuracy,data); 

其解引用由newton返回的指针(未定义的行为,但在这一点上可能会做你想要的)并存储在main中分配的data的第一个插槽中的值。 Sot可能会给你阵列的初始元素newton,但不会改变main中分配给data的内存块中的任何其他内容。

+0

+1我认为你已经覆盖了最糟糕的错误。 – JeremyP 2012-04-04 10:43:31

+0

另外data + i * sizeof(double)应该是data [i],使用add和ptr dereference是data + i * sizeof(double)不必要的复杂度。 – 2012-04-04 10:43:55

+0

只要注意,这行在主'* data = * newton(root,accuracy,data);'这将分配第一个double在任何newton返回数据的第一个元素。 – JeremyP 2012-04-04 10:45:01

0
void newton(double initialrt,double accuracy,double *data) 
{ 
    double root[102]; 
    data=root; 
    // at this moment the values in the original argument data[] 
    // are no longer accessible to this function. 
    int maxit = 0; 
    root[0] = initialrt; 
    for (int i=1; i < 102; i++) 
     { 
       data[i] = data[i-1] 
       - evalf(data[i-1])/evalfprime(data[i-1]); 
       if (fabs(data[i] - data[i-1]) < accuracy) 
       { 
         maxit=i; 
         break; 
       } 
       maxit=i; 
     } 

     if (maxit+1 == 102 && fabs(data[maxit] - data[maxit-1]) > accuracy) 
     { 
       printf("\nMax iteration reached, method terminated"); 
     }  
     else 
     { 
       printf("\nMethod successful"); 
       printf("\nNumber of iterations: %d\nRoot Estimate: %lf\n",maxit+1 
       ,data[maxit); 
     } 
    return; 
} 

(这仅仅是风格评论,因为真正的问题已经解决)

  • 指针引用和数组索引是C.相当于你​​相当于data[i] = ...
  • 的返回值是无用的,函数可能会返回一些有用的东西(例如精度)
  • return不是函数。没有必要return(something);只是return something;会做。
  • 您返回一个指向本地数组根的指针,当调用者看到它时超出了范围。
  • 空白使得阅读体验的差异

UPDATE:在第二个想法,我想在内环类似的OP:

root[i] = root[i-1] 
     - evalf(data[i-1])/evalfprime(data[i-1]); 
if (fabs(data[i] - data[i-1]) < accuracy) 
    { 
    maxit=i; 
    break; 
    } 
maxit=i; 
+0

该死的标签! void void。 – wildplasser 2012-04-04 11:24:21