#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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)