📄 zuisuxiajiang.cpp
字号:
#include<iostream>
#include<math.h>
#define n 2
double f[n][n]={{4,1},{2,1}};
double h[n][n]={{4,0},{0,2}};
using namespace std;
void tidu(double a[n][n],double b[n],double c[n])
//计算梯度向量在某一x下的值。梯度向量的存储方式为第一行存放各项系数,第二行存放x1 次数,第三行存放x2次数。
{
for(int i=0;i<n;i++)
{
c[i]=a[i][0];
for(int j=1;j<=a[i][1];j++)
c[i]=c[i]*b[i];
c[i]=(-1)*c[i];
}
}
double twomatrix(double d[n])
//计算向量的模
{
double m=0;
for(int i=0;i<n;i++)
m=m+d[i]*d[i];
m=sqrt(m);
return (m);
}
double threematrix(double e[n],double f[n][n])
//计算三个矩阵的乘积
{
double w=0;
double g[n];
for(int i=0;i<n;i++)
{
g[i]=0;
for(int j=0;j<n;j++)
g[i]=g[i]+e[j]*f[j][i];
w=w+g[i]*e[i];
}
return(w);
}
void main()
{
double p[n],x[n];
int i,j;
double s,c,temp,lamada;
cout<<"请输入初始点x0:"<<endl;
for(i=0;i<n;i++)
cin>>x[i];
cout<<"请输入精度s:";
cin>>s;
j=0;
while(1)
{
tidu(f,x,p);
//for(i=0;i<n;i++)
//cout<<p[i]<<endl;
c=twomatrix(p);
//cout<<c<<endl;
if(c<=s)break;
temp=threematrix(p,h);
lamada=c*c/temp;//计算步长
//cout<<lamada<<endl;
for(i=0;i<n;i++)
x[i]=x[i]+lamada*p[i];
j++;
//for(i=0;i<n;i++)
// cout<<x[i]<<endl;
}
cout<<"方程的近似解为:"<<endl;
for(i=0;i<n;i++)
cout<<x[i]<<endl;
cout<<"搜索次数为:"<<j<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -