用高斯列主无消去法解线性方程组
带C运行成功原代码 我改VB的时候不会用函数 如果大哥们方便就全按C帮小弟改一下吧
VB
rivate Sub Command3_Click()
Dim icount As Integer, i As Long, j As Long, k As Long, p As Long, flag As Integer
Dim sum As Single
Dim a() As Single, l() As Single, x() As Single, ark As Integer '定义数组
ReDim a(10, 11), l(10, 10), x(10)
p = 100
icount = CInt(Text1.Text)k = 0 '初始化
For i = 1 To icount
For j = 1 To icount + 1
a(i, j) = CSng(Text2(k).Text)
a(i, j) = p * a(i, j)
k = k + 1
Next j
Next i
For k = 1 To icount - 1
ark = Abs(a(1, k)) For i = k To icount '比校系数大小的函数
If Abs(a(i)(k)) > ark Then'出错提示类型不匹配
ark = Abs(a(i)(k))
flag = i
Else
End If
Next i
If ark = 0 Then '判断方程是否为线性方程,即是否合法
Magbox "此方程组不合法"
Else
End If
If flag = k Then
Else
For i = 1 To icount + 1 '交换行
a(0)(i) = a(flag)(i)
Next i
For i = 1 To icount + 1
a(flag)(i) = a(k)(i)
Next i
For i = 1 To icount + 1
a(k)(i) = a(0)(i)
Next i
For i = k + 1 To icount
For j = k + 1 To icount + 1
a(i)(j) = a(i)(j) - a(k)(j) * a(i)(k) / a(k)(k)
Next j
Next i
End If
Next k
x(icount) = a(icount)(icount + 1) / a(icount)(icount)
For k = icount - 1 To 1
sum = 0
For j = k + 1 To icount
sum = sum + a(k)(j) * x(j)
Next j
x(k) = (a(k)(icount + 1) - sum) / a(k)(k)
k = k - 1
Next k
For i = 1 To icountText3 = Text3 & "X" & CStr(i) & "=" & Format(x(i), "0.00000") & " "
End Sub
C
#include<math.h>
#include<stdio.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;
int flag,n;
exchange(int r,int k);
float max(int k);
message();main()
{
float x[NUMBER]; /*此数组用于存放方程解*/
int r,k,i,j;
char celect;
clrscr();
printf("\n\n用Gauss列主元消元法解线性方程组");
printf("\n\n1.解方程组请按Enter.");
printf("\n\n2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n\n 输入方程组的维数:n=");
scanf("%d",&n);
printf(" \n\n现在输入系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/ for(j=1;j<=n+1;j++) /*将刚才输入的数存入数组*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) /*判断方程是否为线性方程,即是否合法*/
{
printf("\n\n此方程组不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
message();
}exchange(int r,int k) /*交换行的矩函数*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}float max(int k) /*比校系数大小的函数*/
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}message() /*实现菜单选择的函数*/
{
printf("\n\n 继续运算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\n不合法的输入!");message();}
}
}
带C运行成功原代码 我改VB的时候不会用函数 如果大哥们方便就全按C帮小弟改一下吧
VB
rivate Sub Command3_Click()
Dim icount As Integer, i As Long, j As Long, k As Long, p As Long, flag As Integer
Dim sum As Single
Dim a() As Single, l() As Single, x() As Single, ark As Integer '定义数组
ReDim a(10, 11), l(10, 10), x(10)
p = 100
icount = CInt(Text1.Text)k = 0 '初始化
For i = 1 To icount
For j = 1 To icount + 1
a(i, j) = CSng(Text2(k).Text)
a(i, j) = p * a(i, j)
k = k + 1
Next j
Next i
For k = 1 To icount - 1
ark = Abs(a(1, k)) For i = k To icount '比校系数大小的函数
If Abs(a(i)(k)) > ark Then'出错提示类型不匹配
ark = Abs(a(i)(k))
flag = i
Else
End If
Next i
If ark = 0 Then '判断方程是否为线性方程,即是否合法
Magbox "此方程组不合法"
Else
End If
If flag = k Then
Else
For i = 1 To icount + 1 '交换行
a(0)(i) = a(flag)(i)
Next i
For i = 1 To icount + 1
a(flag)(i) = a(k)(i)
Next i
For i = 1 To icount + 1
a(k)(i) = a(0)(i)
Next i
For i = k + 1 To icount
For j = k + 1 To icount + 1
a(i)(j) = a(i)(j) - a(k)(j) * a(i)(k) / a(k)(k)
Next j
Next i
End If
Next k
x(icount) = a(icount)(icount + 1) / a(icount)(icount)
For k = icount - 1 To 1
sum = 0
For j = k + 1 To icount
sum = sum + a(k)(j) * x(j)
Next j
x(k) = (a(k)(icount + 1) - sum) / a(k)(k)
k = k - 1
Next k
For i = 1 To icountText3 = Text3 & "X" & CStr(i) & "=" & Format(x(i), "0.00000") & " "
End Sub
C
#include<math.h>
#include<stdio.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;
int flag,n;
exchange(int r,int k);
float max(int k);
message();main()
{
float x[NUMBER]; /*此数组用于存放方程解*/
int r,k,i,j;
char celect;
clrscr();
printf("\n\n用Gauss列主元消元法解线性方程组");
printf("\n\n1.解方程组请按Enter.");
printf("\n\n2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n\n 输入方程组的维数:n=");
scanf("%d",&n);
printf(" \n\n现在输入系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/ for(j=1;j<=n+1;j++) /*将刚才输入的数存入数组*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) /*判断方程是否为线性方程,即是否合法*/
{
printf("\n\n此方程组不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
message();
}exchange(int r,int k) /*交换行的矩函数*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}float max(int k) /*比校系数大小的函数*/
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}message() /*实现菜单选择的函数*/
{
printf("\n\n 继续运算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\n不合法的输入!");message();}
}
}
解决方案 »
- 关于十六进制数组的问题,万分急,马上散分
- 周末散分 --- 1
- mfhflexgrid中的数据导入到EXCEL中的问题
- 用VB能否实现显示QQ的IP?目前的QQ外挂显IP,该作者说是用vc+delphi的,高手指点!
- 实时错误‘424’ 要求对象????在一个远程控制的服务器端的程序中
- 关于VB用API改变分辨率问题?
- 接在打印服务器上的打印机端口怎么打开?
- 各位老大進來看一下吧
- 为什么我的vb6.0中所有控件的picture属性不能用
- 如何在vb的窗体上播放flash动画??????????????
- 求救,关于mshflexgrid的奇怪问题
- 求使用Active Report2.0報表控件的高手(在線等)
Dim a() As Double, b() As Double, n As Integer, i As Integer, j As Integer, f As Integer, p As Single, k As Integer
n = CInt(Text1.Text)
p = 10
ReDim a(n, n) As Double, b(n) As Double
f = 1
i = 1
j = 1
For k = 0 To (n * (n + 1) - 1) '初始化数组
If k Mod (n + 1) = n Then b(f) = CSng(Text2(k).Text)
b(f) = p * b(f)
f = f + 1
i = i + 1
j = 1
Else
a(i, j) = CSng(Text2(k).Text)
a(i, j) = p * a(i, j)
j = j + 1
End IfNext kSolve a(), b() '调用函数
For i = 1 To nText3 = Text3 & "X" & CStr(i) & "=" & Format(b(i), "0.00") & " "
Next i
Text3 = Text3 & " " & Chr(13) + Chr(10)
End Sub
Private Sub Solve(a() As Double, b() As Double) '列主元消去法Dim ii As Integer, i As Integer, j As Integer, n As Integer
Dim d1 As Double
Dim maxV As Double, maxI As Integern = UBound(b)For ii = 1 To n - 1
maxV = Abs(a(ii, ii))
maxI = ii
For i = ii To n
If Abs(a(i, ii)) > maxV Then
maxV = Abs(a(i, ii))
maxI = i '找出主行
End If
Next i
If ii <> maxI Then '换行
d1 = b(maxI)
b(maxI) = b(ii)
b(ii) = d1
For j = ii To n
d1 = a(maxI, j)
a(maxI, j) = a(ii, j)
a(ii, j) = d1
Next j
End IfFor i = ii + 1 To n '消元
d1 = a(i, ii) / a(ii, ii)
For j = ii + 1 To n
a(i, j) = a(i, j) - a(ii, j) * d1
Next j
b(i) = b(i) - b(ii) * d1
Next i
Next iib(n) = b(n) / a(n, n) '回代
For i = n - 1 To 1 Step -1
d1 = 0#
For j = i + 1 To n
d1 = d1 + a(i, j) * b(j)
Next j
b(i) = (b(i) - d1) / a(i, i)
Next iEnd Sub