您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > matlab使用(解N元方程组)
试着用C语言编程解N元方程组#include#defineM10floatfdel(float*p,intn){inti;floatsum=0;for(i=0;isum+=*(p+i);sum/=n;return(fabs(sum));}voidchu(float*p){inti;for(i=0;i*(p+i)=999;return;}voidprint(float*p,intn){inti;for(i=0;iprintf(x%d=%f,i+1,*(p+i));return;}/**voidscan(float**p,intn){inti,j;for(i=0;ifor(j=0;j{printf(a%d%d=,i+1,j+1);scanf(%f,*(p+i)+j);}return;}**/voidden(float*a,float*b,intn){inti;for(i=0;i*(a+i)=*(b+i);return;}voidjie(float*p0,floata[M][M],float*p,float*b,intn){floatsum=0;inti,j;for(i=0;i{for(j=0;j{if(i!=j)sum=sum+a[i][j]*p0[j];else{n=a[i][j];continue;}}*(p+i)=*(b+i)-sum/n;}}main(){floatx0[M],xi[M][M],b[M],x[M];inti,j,n;chu(x0);chu(b);chu(x);for(i=0;i{printf(x0=%f,x0[i]);printf(b=%f,b[i]);printf(x=%f,x[i]);}for(i=0;ifor(j=0;jxi[i][j]=0;printf(shuruwuizhishugeshun=);scanf(%d,&n);printf(shurufangchengzugegexishua[i][j]=);for(i=0;ifor(j=0;j{printf(a%d%d=,i+1,j+1);scanf(%f,&xi[i][j]);}printf(x[1][1]=%f,xi[1][1]);for(i=0;iprint(*(xi+i),n);for(i=0;iprintf(abs=%f,fdel(*(xi+i),n));}#includestdio.hdoublef(doublex){doubley;y=2*x*x*x-9*x*x+12*x-3;return(y);}intmain(){doublet,a=0,b=1,tmp;t=(a+b)/2;while((f(b)-f(a))1e-8){t=(a+b)/2;tmp=f(t);if(tmp==0)break;elseif(tmp0)a=t;elseb=t;}printf(该方程在(0,1)之间的根是%.8f,f(%.8f)=%.8f\n,t,t,f(t));return0;}牛顿迭代法(Newton'smethod)又称为牛顿-拉夫逊方法(Newton-Raphsonmethod),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x)=0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴交点的横坐标x2=x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数f(x)=f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2!+…取其线性部分,作为非线性方程f(x)=0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0)这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。对于做应用的来说,更关心的是怎么实现。找了一下算法,发现主要是MATLAB编程语言和C语言。这个是我首先找到的MATLAB的代码---------------------------------%牛顿迭代法解方程y=x.^2-x-1x=1.5;formatlong;x1=x-func2_1(x)/func2_1_1(x);if(abs(x1)1.5)delt=abs(x1-x);elsedelt=abs((x1-x)/x1);endwhile(delt1e-6|abs(func2_1(x))1e-6)x=x1;x1=x-func2_1(x)/func2_1_1(x);if(abs(x1)1.5)delt=abs(x1-x);elsedelt=abs((x1-x)/x1);endiffunc2_1(x1)==0breakendenddisp('解方程y=x.^2-x-1,牛顿迭代法结果')x1%编辑函数functiony=func2_1(x)y=x.^2-x-1;functiony=func2_1_1(x)y=2*x-1--------------------------没用过MATLAB,但是语言是相通的,修改一下即可。呵呵,还是vb简单以下是VB代码Subp1()'牛顿迭代法n=0xx=2x=4'设定初值x1=x-func2_1(x)/func2_1_1(x)IfAbs(x1)xxThendelt=Abs(x1-x)Elsedelt=Abs((x1-x)/x1)EndIfDoWhile(delt0.000001orAbs(func2_1(x))0.000001)n=n+1x=x1x1=x-func2_1(x)/func2_1_1(x)If(Abs(x1)xx)Thendelt=Abs(x1-x)Debug.Printx1,delt,1Elsedelt=Abs((x1-x)/x1)Debug.Printx1,delt,2EndIfIffunc2_1(x1)=0ThenExitDoEndIfLoopDebug.Print牛顿迭代法结果,x1,迭代次数&nEndSubPrivateFunctionfunc2_1(ByValxAsDouble)AsDouble'原方程func2_1=x^2-x-1EndFunctionPrivateFunctionfunc2_1_1(ByValxAsDouble)AsDouble'原方程的求导后func2_1_1=2*x-1Iffunc2_1_1=0Thenfunc2_1_1=0.00000001'避免因为以0做除数而溢出EndFunction--------------------等等,没装vb怎么办?那你不会没有装office吧?里面有一个vba。好好利用哦。打开excel,ALT+F11,OK!看见编辑器了吧……以下是c语言-------------------#includestdio.h#includeconio.h#includemath.h#defineMAX_DIEDAI_TIME200main(){intn=0;doublex=0;doublejingdu=1e-6;doublefunction(doublex);doubled2function(doublex);doublenewton_diedai(doublex0,int*n,doublejingdu);system(cls);x=newton_diedai(x,&n,jingdu);printf(x=%.7lf\ty=%.7lf\n,x,function(x));getch();return0;}/*====================想要求解的方程的表达式======================*/doublefunction(doublex){returnexp(x)+10*x-3;}/*===========================想要求解的方程的表达式的导数=============================*/doubled2function(doublex){returnexp(x)+10;}/*=============================================牛顿迭代法解方程组的解x0为迭代的初值,n为迭代次数,jingdu为精度function为求根代数式,d2functoin为其导数返回最终符合一定精度的根*/doublenewton_diedai(doublex0,int*n,doublejingdu){doublex,temp;temp=d2function(x0);if(fabs(temp)1e-10)/*防止除数为0*/{x=x0-function(x0)/temp;printf(n=%d\tx=%.5lf\n,*n,x);}else{printf(error:div0:\nPressanykeytoexit:);getch();exit(1);}if(++(*n)MAX_DIEDAI_TIME){printf(diedaitime:%dMAX_DIEDAI_TIME:\nPressanykeytoexit:,*n);getch();exit(1);}temp=function(x);if(fabs(temp)jingdu)returnx;elsereturnnewton_diedai(x,n,jingdu);}------------------好了,到现在位置,牛顿迭代法解一元方程的三种语言的算法是ok了,不过MATLAB的语言我没有验证过,是网上copy的。(注:c语言和其他两个算法计算的不是一个方程)c语言牛顿迭代法解y=x三次方减去4倍的x的平方减去10等于0在1.0和-5附近的解要求误差小于10的-3次方悬赏分:10|解决时间:2008-1-2214:39|提问者:zhangyi12150请各位高手尽快解决后天俺们就交上去了最佳答案//下面是方法和例子,自己去搞定。牛顿迭代法,是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x(n+1)=g(x(n))=x(n)–f(x(n))/f‘(x(n)).然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x1;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。例1:已知f(x)=cos(x)-x。x的初值为3.14159/4,用牛顿法求解方程f(x)=0的近似值,要求精确到10E-6。算法分析:f(x)的Newton代法构造方程为:x(n+1)=xn-(cos(xn)-xn)/(-sin(xn)-1)。#includestdio.hdoubleF1(doublex);//要求解的函数doubleF2(doublex);//要求解的函数的一阶导数函数doubleNewton(double
本文标题:matlab使用(解N元方程组)
链接地址:https://www.777doc.com/doc-2887150 .html