牛顿法解非线性方程组c++程序?

牛顿法解非线性方程组c++程序?,第1张

#include<iostream>

#include<cstdlib>

#include<cmath>橘则

using

namespace

std

#define

N

2

//用来设置方程组的行数

#define

eps

2.2204e-16

double*

MatrixMultiply(double*

J,double

Y[])

double*

Inv(double

*J)

double

norm(double

Q[])

double*

F(double

X[])

double*

JF(double

X[])

int

method(double*

Y,double

epsilon)

int

newdim(double

P[],double

delta,double

epsilon,int

max1,double

*err)

{

double

*Y=NULL,*J=NULL,Q[2]={0},*Z=NULL,*temp=NULL

double

relerr=0.0

int

k=0,i=0,iter=0

Y=F(P)

for(k=1k<max1k++)

{

J=JF(P)

temp=MatrixMultiply(Inv(J),Y)

for(i=0i<Ni++)

Q[i]=P[i]-temp[i]

Z=F(Q)

for(i=0i<Ni++)

temp[i]=Q[i]-P[i]

*err=norm(temp)

relerr=*err/茄伍旦(norm(Q)+eps)

for(i=0i<Ni++)

P[i]=Q[i]

for(i=0i<Ni++)

Y[i]=Z[i]

iter=k

if((*err<delta)||(relerr<delta)||method(Y,epsilon))

break

}

return

iter

}

int

method(double*

Y,double

epsilon)

{

if(fabs(Y[0])<epsilon&&fabs(Y[1])<epsilon)

return

1

else

return

0

}

//矩阵乘法,要求,J为方阵,Y为与J维数相同的列向量

double

*MatrixMultiply(double*

J,double

Y[])

{

double

*X=NULL

int

i=0,j=0

X=(double*)malloc(N*sizeof(double))

for(i=0i<Ni++)

X[i]=0

for(i=0i<Ni++)

for(j=0j<Nj++)

X[i]+=J[i*N+j]*Y[j]

return

X

}

//二阶矩阵的求逆(在M次多项式曲线拟合算法文件中给出了对任意可逆矩阵的求逆算法)

double

*Inv(double

*J)

{

double

X[4]={0},temp=0.0

int

i=0

temp=1/(J[0]*J[3]-J[1]*J[2])

X[0]=J[3]

X[1]=-J[1]

X[2]=-J[2]

X[3]=J[0]

for(i=0i<4i++)

J[i]=temp*X[i]

return

J

}

double

norm(double

Q[])

{

double

max=0.0

int

i=0

for(i=0i<Ni++)

{

if(Q[i]>max)

max=Q[i]

}

return

max

}

double*

F(double

X[])

{

double

x=X[0]

double

y=X[1]

double

*Z=NULL

Z=(double*)malloc(2*sizeof(double))

Z[0]=x*x-2*x-y+0.5

Z[1]=x*x+4*y*y-4

return

Z

}

double*

JF(double

X[])

{

double

x=X[0]

double

y=X[1]

double

*W=NULL

W=(double*)malloc(4*sizeof(double))

W[0]=2*x-2

W[1]=-1

W[2]=2*x

W[3]=8*y

return

W

}

main()

{

double

P[2]={0}

double

delta=0.0,epsilon=0.0,err=0.0

int

max1=0,iter=0,i=0

cout<<"牛顿法解非线性方程组:\nx^2-4-y+2=0\nx^2+4*y^2-2=0\n"

cout<<"\n输入的初始近似值x0,y0\n"

for(i=0i<2i++)

cin>>P[i]

cout<<"请颤扰依次输入P的误差限,F(P)的误差限,最大迭代次数\n"

cin>>delta

cin>>epsilon

cin>>err

iter=newdim(P,delta,epsilon,max1,&err)

cout<<"收敛到P的解为:\n"

for(i=0i<2i++)

cout<<"X("<<i+1<<")="<<P[i]<<endl

cout<<"\n迭代次数为:

"<<iter

cout<<"\n."<<err<<endl

getchar()

}

我不知道你的abc常数究竟等于几,我在代码里空出来,你自己补充早孙

#include <stdio.h>

#include <math.h>

#define a () //自己添加值

#define b ()

#define c ()

#define e (2.7182)

#define L(t) 1/雹雀(a + b * pow(e, -ct))

这样就源睁早ok了。L(t)就是你要的宏。

对于非线性函数,可以用nlinfit( )函数来拟合,其一般格式

[a,r,J] = nlinfit(x,y,func,x0)

针轮盯对你的问题,可以通过下列方式

func=inline('粗雹0.826^2-a(1).^2*sin(a(2)+(t-1)*pi/10))^0.5-a(1).*cos(a(2)+(t-1)*pi/腊凳和10','a','t')

式中:a=a(1),k=a(2)

t0=[0 0]

[a,r,J] = nlinfit(t,y,func,t0)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12472718.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存