英雄请进(数学计算问题,挑战高手)

尚和空四 2004-12-02 04:14:24
想请教一个算法问题
解一个方程组

X + Y + Z = 6
X + Z = 4
X + Y = 3

请高手给出详细解法asp的
谢谢帮忙
...全文
269 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
尚和空四 2004-12-03
  • 打赏
  • 举报
回复
谢谢各位,分数不多 多谢大家的帮忙,
各种算法 我慢慢的研究
prcgolf 2004-12-03
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
Public Function Determinant(m() As Single) As Single
Dim i As Long, j As Long, k As Long, row As Long, order As Long
Dim r As Long, c As Long, Pivot As Single, Pivot2 As Single, temp() As Single
Determinant = 1
row = UBound(m, 1)
If UBound(m, 2) <> row Then MsgBox "这不是方阵": Exit Function
ReDim temp(1 To row)
For i = 1 To row
Pivot = 0
For j = i To row
For k = i To row
If Abs(m(k, j)) > Pivot Then
Pivot = Abs(m(k, j))
r = k: c = j
End If
Next k
Next j
If Pivot = 0 Then Determinant = 0: Exit Function
If r <> i Then
order = order + 1
For j = 1 To row
temp(j) = m(i, j)
m(i, j) = m(r, j)
m(r, j) = temp(j)
Next j
End If
If c <> i Then
order = order + 1
For j = 1 To row
temp(j) = m(j, i)
m(j, i) = m(j, c)
m(j, c) = temp(j)
Next j
End If
Pivot = m(i, i)
Determinant = Determinant * Pivot
For j = i + 1 To row
Pivot2 = m(j, i)
If Pivot2 <> 0 Then
For k = 1 To row
m(j, k) = m(j, k) - m(i, k) * Pivot2 / Pivot
Next
End If
Next
Next
Determinant = Determinant * (-1) ^ order
End Function
 

参数说明:

m():欲求行列式之方阵。

 

范例:

1.由键盘输入矩阵元素:

Private Sub Command1_Click()
Dim Keyin As String, m() As Single
Keyin = InputBox("请输入方阵(square matrix)," _
& "以分号"";""来分隔列元素,以空白来分隔行元素。" _
& vbNewLine & "例如有一3×3的矩阵:" & vbNewLine & "1 2 3" & vbNewLine & _
"4 5 6 " & vbNewLine & "7 8 9" & vbNewLine & "则输入: 1 2 3;4 5 6;7 8 9 ")
If SepStrToMatrix(Keyin, ";", " ", m) Then
Debug.Print Determinant(m)
Else
MsgBox "矩阵输入有误,请重新输入。"
End If
End Sub
其中 SepStrToMatrix 这个副程式,请参阅本站的 将字串拆解成阵列。

若有一方阵如下:

2 -1 3 0
4 -2 7 0
-3 -4 1 5
6 -6 8 0
执行 Command1,并在 Inputbox 中输入 2 -1 3 0;4 -2 7 0;-3 -4 1 5; 6 -6 8 0,在 VB 的即时运算视窗可得此方阵的 Determinant= -30。

 

2.由档案读入矩阵元素:

Private Sub Command2_Click()
Dim FileNo As Long, Keyin As String
Dim temp As String, m() As Single
FileNo = FreeFile
Open "c:\users\det.txt" For Input As #FileNo
Do While Not EOF(FileNo)
Line Input #FileNo, temp
If Trim(temp) <> "" Then Keyin = Keyin & temp & ";"
Loop
Close #FileNo
Keyin = Mid(Keyin, 1, Len(Keyin) - 1)
If SepStrToMatrix(Keyin, ";", " ", m) Then
Debug.Print Determinant(m)
Else
MsgBox "方阵输入有误,请重新输入。"
End If
End Sub
其中 SepStrToMatrix 这个副程式,请参阅本站的 将字串拆解成阵列。

若有一矩阵储存在 "C:\users\det.txt" 如下所示:

1 1 0 3
2 1 -1 1
-1 2 3 -1
3 -1 -1 2
执行 Command2 之后,在 VB 的即时运算视窗可得此方阵的 Determinant= -39。

  • 打赏
  • 举报
回复
这个是用线代解,新华书店有三本很好的书,基本所有的数学算法都有的,可以直接拿来用的,具体书名我不记得了如果需要的,可以给我发短消息
我现在在下 WINDOWS XP HOME EDITION
ccton 2004-12-02
  • 打赏
  • 举报
回复
大学的高等数学全还给老师了
哎...
=============================
不记得学过高等数学,所以就没什么可还老师的 :)

矩阵是线形代数的,有那么点印象学过,恩,这个肯定还老师了,:)
-神仙- 2004-12-02
  • 打赏
  • 举报
回复
线性代数.......
中年CodeBoy 2004-12-02
  • 打赏
  • 举报
回复
嘿嘿,好多算法阿
超级大笨狼 2004-12-02
  • 打赏
  • 举报
回复
先做一个这个放这里,谁有兴趣可以继续做。

<HTML>
<HEAD>
<style>
input
{
width:40;
}
</style>
</HEAD>

<BODY>
<p id="ppp"></p>
<input id="member" value="3"/>
<button onclick="vbs:Make_n_Members_Function">元一次方程组 </button>
<button>开始算</button>
<SCRIPT LANGUAGE="vbScript">
'定义矩阵
dim matrix()

'产生一个n元一次方程,默认是3元
Make_n_Members_Function

sub Make_n_Members_Function()

'******本过程产生一个n元一次方程,系数随机*****
dim n
'n必须是数字
if not isnumeric(member.value) then exit sub
'必须大于1
if not cint(member.value)>1 then exit sub
'定义n元一次方程
n = cint(cint(member.value))'元数

dim i,j,str

redim matrix(n,n)
'系数
dim quotiety

str = ""
for i=0 to n-1
for j=0 to n-1
quotiety = RRR()
matrix(i,j) = quotiety
str = str & "<input value=' " & quotiety & " '/> "
str = str & "x" & j+1
if j<>n-1 then
str = str & " + "
else
quotiety = RRR()
matrix(i,j+1) = quotiety
str = str & " = "
str = str & "<input value=' " & quotiety & " '/><br/>" & vbcrlf
end if
next
next
ppp.innerHTML = str
'test
end sub

function RRR()
'用来产生-9到9随即整数的函数
randomize
RRR =cint(rnd * 18)-9
end function

sub test()
'测试用函数
dim str:str=""
for i=0 to ubound(matrix,1)
for j=0 to ubound(matrix,2)
str = str & matrix(i,j)
next
str = str & vbcrlf
next
alert(str)
end sub
</SCRIPT>
</BODY>
</HTML>
yayaleon801030 2004-12-02
  • 打赏
  • 举报
回复
偶也用的是高斯消去法, 可以直接运行,各位DX请看看
点评可以直接找我
MSN:yayaleon801030@hotmail.com
-------------------------------------------------------------
<html>
<head>
<title>求解n元1次方程组</title>
</head>

<body>
<%
E1 = Array("1", "1", "1", "6")
E2 = Array("1", "0", "1", "4")
E3 = Array("1", "1", "0", "3")
A0 = getValue(Array(Array(E1(0), E1(1), E1(2)), Array(E2(0), E2(1), E2(2)), Array(E3(0), E3(1), E3(2))))
A1 = getValue(Array(Array(E1(3), E1(1), E1(2)), Array(E2(3), E2(1), E2(2)), Array(E3(3), E3(1), E3(2))))
A2 = getValue(Array(Array(E1(0), E1(3), E1(2)), Array(E2(0), E2(3), E2(2)), Array(E3(0), E3(3), E3(2))))
A3 = getValue(Array(Array(E1(0), E1(1), E1(3)), Array(E2(0), E2(1), E2(3)), Array(E3(0), E3(1), E3(3))))

if ( CInt(A0)<>0 ) then
response.write "X1 = "& A1/A0 & "<br>"
response.write "X2 = "& A2/A0 & "<br>"
response.write "X3 = "& A3/A0 & "<br>"
else
response.write "该方程组的系数行列式的值为0,本程序无法求解!"
end if
%>
</body>
</html>
<%
function getValue(a)
getValue = 0
if ( ubound(a)<>ubound(a(0))) then
exit function
end if
if ( ubound(a)=1 ) then
getValue = a(0)(0)*a(1)(1) - a(0)(1)*a(1)(0)
else
'按第一行展开
for i=0 to ubound( a(0) )
if ( CInt( a(0)(i) )<>0 ) then
tmp = Array()
redim tmp( ubound(a)-1 )
for j=0 to UBound(tmp)
'构造列向量
tmp1 = Array()
redim tmp1( ubound(a(0))-1 )
indexK = 0
for k=0 to ubound( a(0) )
if ( k<>i ) then
tmp1(indexK) = a(j+1)(k)
indexK = indexK + 1
end if
next

tmp(j) = tmp1
next

if ( i mod 2=0 ) then
getValue = getValue + a(0)(i)*getValue(tmp)
else
getValue = getValue - a(0)(i)*getValue(tmp)
end if
end if
next
end if
end function
%>
中年CodeBoy 2004-12-02
  • 打赏
  • 举报
回复
X + Y + Z = 6
X + Z = 4
X + Y = 3

<%
DIM STR1,STR2,STR3
DIM TEMP
STR1 = "X+Y+Z"
STR2 = "X+Z"
STR3 = "X+Y"

TEMP=OK(STR1,STR2)
RESPONSE.WRITE "正确答案"&TEMP&"="&Z(STR1)-Z(STR2)


FUNCTION Z(STR)

SELECT STR
CASE "X+Y+Z"
Z = 6
CASE "X+Z"
Z = 4
CASE "X+Y"
Z = 3
END SELECT
END FUNCTION


FUNCTION OK(STRX,STRY)

DIM A,B
A=REPLACE(STRX,"+","")
B=REPLACE(STRY,"+","")
IF LEN(A)>LEN(B) THEN
A=REPLACE(A,B,"")
ELSE
B=REPLACE(B,A,"")
END IF

IF LEN(A)=1 THEN OK=A
IF LEN(B)=1 THEN OK=B

END FUNCTION

%>
以上方法给大家提供一个思路,不要总是把简单的搞复杂了
有几点不完善的地方,比如如果有系数怎么办,变量相等怎么办
留给你们自己思考了,嘿嘿,我没时间写完善了,自己写吧
超级大笨狼 2004-12-02
  • 打赏
  • 举报
回复
http://math.suda.edu.cn/daishu/daishu12/node14.html
若白师妹 2004-12-02
  • 打赏
  • 举报
回复
kurapika5(kurapika)你推荐个有效率的算法呗,除了先用笔算出x=??,y=??;z=??的
超级大笨狼 2004-12-02
  • 打赏
  • 举报
回复
http://math.suda.edu.cn/daishu/daishu12/node13.html
kurapika5 2004-12-02
  • 打赏
  • 举报
回复
倒哦,,,有效率的算法不用要用循环解....no语言了...
超级大笨狼 2004-12-02
  • 打赏
  • 举报
回复
http://math.suda.edu.cn/daishu/daishu12/node12.html

解二元(或三元)一次方程组的基本方法是 Gauss消元法,即把方程组中一部分方程变成未知量较少的方程,直至得到一个一元一次方程,进而可求出方程组的解.在求解未知量较多的线性方程组时,需要使这种解法有规律可遵循、可能简便的方法.
fangq 2004-12-02
  • 打赏
  • 举报
回复
同意小姑娘站住的!
不过运行速度较慢!
尚和空四 2004-12-02
  • 打赏
  • 举报
回复
没有念过大学,现在在自学高等数学,线性代数。
不好意思,谢谢帮忙
超级大笨狼 2004-12-02
  • 打赏
  • 举报
回复
CSDN-->短消息--》liuxiaoyi666
八卦流氓兔
若白师妹 2004-12-02
  • 打赏
  • 举报
回复
大学的高等数学全还给老师了
哎...
超级大笨狼 2004-12-02
  • 打赏
  • 举报
回复
这是线性代数问题,算法的标准思路是这样的:
可以把问题抽象成一个矩阵的乘法

| 1 1 1 | |6|
| 1 0 1 | * (x,y,z) =|4|
| 1 1 0 | |3|

其他请查看线性代数书,关于矩阵的常用计算有《数值分析》(VB或者java/C++代码实现)的通用函数的书可以参考。

或者联系兔子,他学过数值分析,而且有时间。这对他来说很容易地。
昨天他闲着没事,跑我们那里,但是我下班他有回去了,本来想炖兔子肉给大家吃来着。

加载更多回复(3)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧