我编了一个vb小程序用来解方程组,可是点击启动后电脑并不解方程组,cpu使用率只有百分之1或2左右,为什么

我编了一个vb小程序用来解方程组,可是点击启动后电脑并不解方程组,cpu使用率只有百分之1或2左右,为什么,第1张

浮点数比较时不能这样比较,须设定一允许误差,在误差之内的就可认为相等

有基神限的字长不能把小数精确的转化成2进制

If CSng(x + y) = 2.2 And CSng(x - y) = 0.2 Then

Text1.Text = x

Text2.Text = y

End If

这样就行了

小余1的数 都要这样比较

楼上的把精度缩小团锋滑到一位小数 我这里是把精度缩小为塌腊单精度

因为浮点小数 就算出来的差值实际不是0.2 你可以去试验一下

可以这样写,代码如下

#include "pch.h"

#include <iomanip>

#include <iostream>

# include <fstream>

#include <iomanip>

#include <math.h>

void Chasing_method(double **a, double *b, double *xx, int N_num)

using namespace std

//*****************************

//追赶法求解AX=B矩阵

//*****************************

void Chasing_method(double **a, double *b, double *xx, int N_num)

{

int i, j, k

double *gamma = new double[N_num]()

double *alpha = new double[N_num]()

double *beta = new double[N_num]()

double *y = new double[N_num]()

alpha[0] = a[0][0]

beta[0] = a[1][0] / alpha[0]y[0] = b[0] / alpha[0]

for (i = 1i <N_numi++)

{

gamma[i] = a[i - 1][i]

alpha[i] = a[i][i] - gamma[i] * beta[i - 1]

if (i <N_num - 1)

{

beta[i] = a[i + 1][i] / alpha[i]

}

y[i] = (b[i] - gamma[i] * y[i - 1]) / alpha[i]

}

xx[N_num - 1] = y[N_num - 1]

for (i = N_num - 2i >= 0i--)

{

xx[i] = y[i] - beta[i] * xx[i + 1]

}

}

int main()

{

int N_num = 4

double **a = new double*[N_num]()

for (int i = 0i <N_numi++)            //AX=B方程a[n][n]为系数矩阵

a[i] = new double[N_num]()         

double *b = new double[N_num]()           //AX=B方程b[n]为右侧列矩阵

double *x = new double[N_num]()           //AX=B方程x[n]为方程解

ifstream fin("ab.txt")

for (int i=0i <N_numi++)

{

for (int j=0j <N_numj++)

{

fin >>a[i][j]           昌判//读取数

cout <<fixed <<setw(8) <<setprecision(4) <<a[i][j]

}

fin >>b[i]

cout <<fixed <<setw(8) <<setprecision(4) <<b[i] <<endl

}

Chasing_method(a, b, x, N_num)

cout <<"追赶法求得方程组解御穗为:" <<endl

for (int i = 0i <N_numi++)

{

cout<<"x["<<镇迅卜i<<"]=" <<fixed <<setw(8) <<setprecision(4) <<x[i] <<endl

}

}

#include "轮判stdafx.h"

#include <iostream>

#include <cstdlib>

#include <cmath>

using namespace std

//方程一(参见步骤一)

#define f0(x1,x2) (x1*x1-x2-1)

//方程二(参见步骤一)

#define f1(x1,x2) ((x1-2)*(x1-2)+(x2-0.5)*(x2-0.5)-1)

//方程精度(参见步骤一)

#define x_ 0.000001

//矩阵阶数(参见步骤二)

#define matrixNum 2

//计算雅克游磨比矩阵逆(参见步骤三)

double *matrixF2(double *x)

//计算雅克比矩阵(参见步骤二)

double *matrixB1(double *b,double *q,double *matrixB)

void main()

{

//计数器

int i,j

double n

//函数中自变量

double *x

double 神桐斗*b,*c,*q,p

double *t          //(p-matrixB*q)

double *s          //(pT*matrixB)

//方程组函数值

double *matrixF

//矩阵F的雅可比矩阵的逆

double *matrixB

double *matrixB1

//开辟空间

x=(double *)malloc(matrixNum)

b=(double *)malloc(matrixNum)

c=(double *)malloc(matrixNum)

q=(double *)malloc(matrixNum)

s=(double *)malloc(matrixNum)

t=(double *)malloc(matrixNum)

//计算方程组函数值

matrixF=(double *)malloc(matrixNum)

//matrixB=(double *)malloc(matrixNum*matrixNum)

matrixB1=(double*)malloc(matrixNum*matrixNum)

// 自变量输入

cout<<"请输入初值:"

for(i=0i<matrixNumi++)

cin>>*(x+i)

//计算雅克比矩阵逆

matrixB=matrixF2(x)

//计算函数值

*matrixF=f0(*x,*(x+1))

*(matrixF+1)=f1(*x,*(x+1))

do

{

p=0.0

for(i=0i<matrixNumi++)

*(c+i)=*(matrixF+i)

for(i=0i<matrixNumi++)

{

*(b+i)=0

*(q+i)=0

cout<<*(c+i)<<" "

}

cout<<endl<<"x值"

for(i=0i<matrixNumi++)

{

for(j=0j<matrixNumj++)

*(b+i)+=*(matrixB+i*matrixNum+j)*(*(c+j))

*(b+i)=-*(b+i)

*(x+i)=*(x+i)+(*(b+i))

cout<<*(x+i)<<" "

}

cout<<endl

*matrixF=f0(*x,*(x+1))

*(matrixF+1)=f1(*x,*(x+1))

for(i=0i<matrixNumi++)

{

p+=pow(*(b+i),2)

*(q+i)=*(matrixF+i)-*(c+i)

}

n=0

for(i=0i<matrixNumi++)

{

*(t+i)=0

*(s+i)=0

}

for(i=0i<matrixNumi++)

{

for(j=0j<matrixNumj++)

{

*(t+i)+=*(matrixB+i*matrixNum+j)*(*(q+j))

*(s+i)+=*(b+j)*(*(matrixB+j*matrixNum+i))

}

for(j=0j<matrixNumj++)

n+=*(s+i)*(*(q+j))

*(t+i)=*(b+i)-*(t+i)

}

for(i=0i<matrixNumi++)

cout<<endl<<*(q+i)<<" "

cout<<endl<<n<<endl

for(i=0i<matrixNumi++)

for(j=0j<matrixNumj++)

*(matrixB1+i*matrixNum+j)=*(t+i)*(*(s+j))/n+*(matrixB+i*matrixNum+j)

for(i=0i<matrixNumi++)

{

for(j=0j<matrixNumj++)

cout<<*(matrixB1+i*matrixNum+j)<<"   "

cout<<endl

}

getchar()

matrixB=matrixB1

}while(sqrt(p)>x_)

//delete [] s

//delete [] t

//delete [] matrixF

//delete [] matrixB

cout<<"以上为结果"<<endl

getchar()

}

double *matrixF2(double *x)

{

int i,j

double t

double *matrixF1   //矩阵F的雅可比矩阵

double *matrixF2   //矩阵F的雅可比矩阵的逆

matrixF1=(double *)malloc(matrixNum*matrixNum)

matrixF2=(double *)malloc(matrixNum*matrixNum)

for(i=0i<matrixNumi++)

for(j=0j<matrixNumj++)

if(i==j)

*(matrixF2+i*matrixNum+j)=1

else *(matrixF2+i*matrixNum+j)=0

*matrixF1=(f0((*x+x_),*(x+1))-f0(*x,*(x+1)))/x_

*(matrixF1+1)=(f0(*x,(*(x+1)+x_))-f0(*x,*(x+1)))/x_

*(matrixF1+2)=(f1((*x+x_),*(x+1))-f1(*x,*(x+1)))/x_

*(matrixF1+3)=(f1(*x,(*(x+1)+x_))-f1(*x,*(x+1)))/x_

for(i=0i<matrixNumi++)

cout<<*(x+i)<<endl

cout<<"矩阵F在["<<*x<<','<<*(x+1)<<"]的雅可比矩阵"<<endl

for(i=0i<matrixNumi++)

{

for(j=0j<matrixNumj++)

cout<<*(matrixF1+i*matrixNum+j)<<" "

cout<<endl

}

//求矩阵F的雅可比矩阵的逆

t=*matrixF1

for(i=0,j=0j<matrixNumj++)

{

*(matrixF1+i*matrixNum+j)/=t

*(matrixF2+i*matrixNum+j)/=t

}

t=*(matrixF1+1*matrixNum)

for(i=1,j=0j<matrixNumj++)

{

*(matrixF1+i*matrixNum+j)-=*(matrixF1+j)*t

*(matrixF2+i*matrixNum+j)-=*(matrixF2+j)*t

}

t=*(matrixF1+1*matrixNum+1)

for(i=1,j=0j<matrixNumj++)

{

*(matrixF1+i*matrixNum+j)/=t

*(matrixF2+i*matrixNum+j)/=t

}

t=*(matrixF1+1)

for(i=i,j=0j<matrixNumj++)

{

*(matrixF1+j)-=*(matrixF1+i*matrixNum+j)*t

*(matrixF2+j)-=*(matrixF2+i*matrixNum+j)*t

}

for(i=0i<matrixNumi++)

{

for(j=0j<matrixNumj++)

cout<<*(matrixF1+i*matrixNum+j)<<" "

cout<<endl

}

for(i=0i<matrixNumi++)

{

for(j=0j<matrixNumj++)

cout<<*(matrixF2+i*matrixNum+j)<<" "

cout<<endl

}

getchar()

return matrixF2

delete [] matrixF1

delete [] matrixF2

}

//double *matrixB1(double *b,double *q,double *matrixB)

//{

// int i,j

//}

VS2008运行可行


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

原文地址: http://outofmemory.cn/yw/12549786.html

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

发表评论

登录后才能评论

评论列表(0条)

保存