求助:哪位大侠写过解多元一次方程组的程序,进来看一下!请高手帮忙,我写了一下一个小时还未算出来,郁闷!!(100分)

I

idym

Unregistered / Unconfirmed
GUEST, unregistred user!
有一朋友在化工厂工作,工作中需要用到下面这样一个设计配料的小程序,让我帮他写一下, 我一看,觉得就是解多元一次方程组,以前没有怎么做过,呵呵,写了一下算了一个小时还没有算出来,郁闷,请高手帮帮忙给个思路,能给个源码更好,先谢谢各位!

这是一个配方计算表,每张计算表有约10种原料,每种原料的资料如下:
原料 成份含量%
SiO2 Al2O3 CaO MgO B2O3 Fe2O3 TiO2 As2O3 NH4NO3 Na2O3 K2O
硅 砂 98.54 0.35 0.14 0.01 0.10 0.01
硼镁矿 0.88 0.50 4.63 18.05 28.81 0.11 1.28 0.31
叶腊石 70.28 20.75 0.06 0.12 0.46 0.21 0.27 0.24
石灰石 1.64 0.65 54.12 0.43 0.14 0.02 0.56 0.29
硼 酸 48.80
萤 石 16.65 1.45 58.49 0.20
亚砒酸 97.00
硝酸铵 99.50
一、主要功能是计算每种原料的用量,以使其达到如下的成份要求:
成份

SiO2 Al2O3 CaO MgO B2O3 Fe2O3 TiO2 As2O3 NH4NO3 Na2O3 K2O
设计含量
(可随时调整) 54.15 14.60 17.70 4.65 7.50 0.65 1.72
设:硅砂用量为a;硼镁矿用量为b;叶腊石用量为c;石灰石用量为d;硼酸用量为e;萤石用量为f;亚砒酸用量为g;硝酸铵用量为h。解方程式:
A+b+c+d+e+f+g+h=1
98.54%a+0.88%b+70.28%c+1.64%f=54.15%*1
0.35%a+0.50%b+20.75%c+0.65%d+1.45%f=14.60%*1
0.14%a+4.63%b+0.06%c+54.12%d+58.49%f=17.70%*1
0.01%a+18.05%b+0.12%c+0.43%d=4.65%*1
28.81%b+48.80%e=7.50%*1
97%g=0.65%*1
99.5%h=1.72%*1
得到每种原料的用量,即a、b、c、d、e、f、g、h的值

后面三个可以不计,实际上就是解一个5元一次方程组。如下:
A+b+c+d+(7.5-28.81%*b)/48.8+f+0.65*1/97+1.72/99.5=1
98.54%a+0.88%b+70.28%c+1.64%f=54.15%*1
0.35%a+0.50%b+20.75%c+0.65%d+1.45%f=14.60%*1
0.14%a+4.63%b+0.06%c+54.12%d+58.49%f=17.70%*1
0.01%a+18.05%b+0.12%c+0.43%d=4.65%*1

请大家帮忙看看,进者有分!!
 
给你指个方向
这个得用线代,计算方法就讲这个。
 
去找矩阵计算的代码,可以解决你的问题。
 
全世界最笨的代码,不过你千万别这样写,解五元一次方程你不会不知道吧:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,d,e,f:single;
begin
a:=0;
while a<=1 do
begin
b:=0;
while b<=1 do
begin
c:=0;
while c<=1 do
begin
d:=0;
while d<=1 do
begin
e:=0;
while e<=1 do
begin
f:=0;
while f<=1 do
begin
application.ProcessMessages;
form1.caption:=floattostr(a)+'/'+floattostr(b)+'/'+floattostr(c)+'/'+floattostr(d)+'/'+floattostr(e)+'/'+floattostr(f);
if getasynckeystate(vk_escape)<0 then halt;
if (abs(a+b+c+d+(7.5-28.81/100*b)/48.8+f+0.65*1/97+1.72/99.5)-1<1e-8)
and (abs(98.54/100*a+0.88/100*b+70.28/100*c+1.64/100*f-54.15/100)<1e-8)
and (abs(0.35/100*a+0.50/100*b+20.75/100*c+0.65/100*d+1.45/100*f-14.60/100)<1e-8)
and (abs(0.14/100*a+4.63/100*b+0.06/100*c+54.12/100*d+58.49/100*f-17.70/100)<1e-8)
and (abs(0.01/100*a+18.05/100*b+0.12/100*c+0.43/100*d-4.65/100)<1e-8) then memo1.Lines.Add(floattostr(a)+'/'+floattostr(b)+'/'+floattostr(c)+'/'+floattostr(d)+'/'+floattostr(e)+'/'+floattostr(f));
f:=f+0.001;
end;
e:=e+0.001;
end;
d:=d+0.001;
end;
c:=d+0.001;
end;
b:=b+0.001;
end;
a:=a+0.001;
end;
end;

end.
 
新问题:我用高斯消元法,把方程解出来了,但是解里面有两个是负数,是怎么回事呀?在实际配料时不可能为负数呀,怎么加条件呀?哪位做过或知道请指教!!
 
这个就帮不上忙了
 
顶部