matlab使用(解N元方程组)

时间:2026-01-21

试着用C语言编程解N元方程组

#include

#define M 10

float fdel(float *p,int n)

{ int i;

float sum=0;

for(i=0;i

sum+=*(p+i);

sum/=n;

return (fabs(sum));

}

void chu(float *p)

{int i;

for(i=0;i

*(p+i)=999;

return ;}

void print(float *p,int n)

{int i;

for(i=0;i

printf("x%d=%f ",i+1,*(p+i));

return ;}

/**void scan(float **p,int n)

{int i,j;

for(i=0;i

for(j=0;j

{printf(" a%d%d=",i+1,j+1);

scanf("%f",*(p+i)+j);}

return ;}**/

void den(float *a,float *b,int n)

{int i;

for(i=0;i

*(a+i)=*(b+i);

return ;}

void jie(float *p0,float a[M][M],float *p,float *b,int n)

{float sum=0;

int i,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()

{ float x0[M],xi[M][M],b[M],x[M];

int i,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;i

for(j=0;j

xi[i][j]=0;

printf("shu ru wuizhishu geshu n=");

scanf("%d",&n);

printf( " shu ru fangchengzu gege xishu a[i][j]= ");

for(i=0;i

for(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;i

print(*(xi+i),n);

for(i=0;i

printf(" abs=%f",fdel(*(xi+i),n));

}

#include <stdio.h>

double f(double x)

{

double y;

y=2*x*x*x-9*x*x+12*x-3;

return(y);

}

int main()

{

double t,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;

else if(tmp<0)

a=t;

else

b=t;

}

printf("该方程在(0,1)之间的根是%.8f,f(%.8f)=%.8f\n",t,t,f(t));

return 0;

}

牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在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-1

x=1.5;

format long;

x1=x-func2_1(x)/func2_1_1(x);

if(abs(x1)<1.5)

delt=abs(x1-x);

else

delt=abs((x1-x)/x1);

end

while(delt>1e-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);

else

delt=abs((x1-x)/x1);

end

if func2_1(x1)==0

break

end

end

disp('解方程y=x.^2-x-1,牛顿迭代法结果')

x1

%编辑函数

function y=func2_1(x)

y=x.^2-x-1;

function y=func2_1_1(x)

y=2*x-1

--------------------------

没用过MATLAB,但是语言是相通的,修改一下即可。呵呵,还是vb简单

以下是VB代码

Sub p1()

'牛顿迭代法

n = 0

xx = 2

x = 4 '设定初值

x1 = x - func2_1(x) / func2_1_1(x)

If Abs(x1) < xx Then

delt = Abs(x1 - x)

Else

delt = Abs((x1 - x) / x1)

End If

Do While (delt > 0.000001 or Abs(func2_1(x)) > 0.000001)

n = n + 1

x = x1

x1 = x - func2_1(x) / func2_1_1(x)

If (Abs(x1) < xx) Then

delt = Abs(x1 - x)

Debug.Print x1, delt, "1"

Else

delt = Abs((x1 - x) / x1)

Debug.Print x1, delt, "2"

End If

If func2_1(x1) = 0 Then

Exit Do

End If

Loop

Debug.Print "牛顿迭代法结果", x1, "迭代次数" & n

End Sub

Private Function func2_1(ByVal x As Double) As Double

'原方程

func2_1 =x ^ 2 - x - 1

End Function

Private Function func2_1_1(ByVal x As Double) As Double

'原方程的求导后

func2_1_1 = 2 * x - 1

If func2_1_1 = 0 Then func2_1_1 = 0.00000001 …… 此处隐藏:9003字,全部文档内容请下载后查看。喜欢就下载吧 ……

matlab使用(解N元方程组).doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219