matlab使用(解N元方程组)
时间:2026-01-21
时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:办公楼建筑设计说明(参考)
下一篇:智能控制课后答案