資源簡介
華電數值計算方法課本算法,包括列主元消去 LU分解 最小二乘法等九個算法

代碼片段和文件信息
#include
#include“windows.h“
#include
#include
//#include?
#include??
double?aaa[15]b[16];
int?gy(double?a[15]int?n);
void?shuchu(double?a[15]int?n);
void?shuru();
int?zhengshu(double?x)//這個函數的建立是為了使這個程序能夠處理系數不是整數的方程組把任意位數的小數轉換為整數,如0.004變為4。
{
int?ij;
char?ss[20]s[20];//這里沒有采用將小數一直×10的方法是因為c語言對于浮點數的內存問題,對于三位以上小數進行的保留失真
gcvt(x8ss);//把浮點數轉化為字符串,最多8位小數精度
int?n=strlen(ss);
for(?i=0j=0;i {
if(ss[i]!=‘.‘)
{
s[j]=ss[i];
j++;
}
}
s[n-1]=‘\0‘;
j=atoi(s);//把移除小數點后的字符串轉化為整型數字
return?j;
}
int?gb(double?adouble?b)//求兩個正整數的最小公倍數
{
int?ija1b1;
a1=zhengshu(a);
b1=zhengshu(b);
for(i=a1;i {
if(i%a1==0&&i%b1==0)
break;
}
j=i/b;
return?j;
}
void?jisuan(double?a[15][16]int?n)//化簡并計算矩陣這里沒有采用書上的算法,因為書上的算法采用直接相除會產生一定的誤差,這里采取手算的時候兩行同乘到最小公倍數做差的方法計算;
{
double?kmaxsaa[15];
int ?ijNtgb1gb2pgy1;
N=n;
for(i=0;i {
if(a[i][0]<0)
{
for(j=0;j a[i][j]=-a[i][j];
}
}
for(t=0;t {
max=a[t][t];//從這一步開始是一個大循環找出第t列消元后的最大值
for(i=t;i {
//max=a[i][1];
if(max max=a[i][t];
}
for(i=t;i {
if(max==a[i][t])
{
for(j=0;j<=N;j++)
{
k=a[t][j];
a[t][j]=a[i][j];
a[i][j]=k;
}
break;//防止出現有兩個相同最大數時的情況
}
}
for(i=t+1;i {
if(a[i][t]!=0)
{
gb1=gb(maxa[i][t]);//gb1等于第i行乘的倍數
gb2=gb(a[i][t]max);//gb2等于主元行乘的倍數
for(j=0;j<=N;j++)//置換第i行
{
a[i][j]=gb1*a[i][j]-gb2*a[t][j];
}
}
if(a[i][t]==0)
{
for(j=0;j<=N;j++)
a[i][j]=a[i][j];
}
if(a[i][t+1]<0)//保證第一個非零的數字是正數以確保gb函數有效
{
for(p=0;p<=N;p++)
{
a[i][p]=-a[i][p];
}
}
double?aa[15];//從這一行開始對每一行進行化簡除以最大公約數,這是為了防止出現高階情況下不化簡出現的數字過大進而溢出計算機無法處理的情況
for(j=0;j<=N;j++)
{
if(a[i][j]>0)
{
aa[j]=a[i][j];
}
else?
{
aa[j]=-a[i][j];
}
}
gy1=gy(aaN);//調用求公約數的函數,對每一行進行化簡
for(j=0;j<=N;j++)
{
a[i][j]=a[i][j]/gy1;//對每一行進行化簡除以最大公約數
}
}
}
for(i=0j=0;j<=N;j++)
{
if(a[i][j]>0)
{
aa[j]=a[i][j];
}
else?
{
aa[j]=-a[i][j];
}
}
gy1=gy(aaN);
for(j=0;j<=N;j++)
{
a[i][j]=a[i][j]/gy1;
}
cout<<“化簡后的結果是:“;
for(i=0;i {
cout< for(j=0;j<=N;j++)
{
cout< }
}
cout< if(a[N-1][N-1]==0.0)//有待改進
{
cout<<“方程沒有唯一確定的解“;
exit(0);
}
else
{
b[0]=a[N-1][N]*1.0/a[N-1][N-1];//求出最后一個解
for(j=1;j {
s=0.0;
for(i=0;i {
s=s+b[i]*a[N-1-j][N-1-i];
}
if(a[N-1-j][N-1-j]!=0)
b[j]=(a[N-1-j][N]-s)/a[N-1-j][N-1-j]*1.0;
else
{
cout<<“方程無解“< exit(0);
}
}
}
for(i=N-1;i>=0;i--)
{
cout<<“x“<
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2017-04-08?11:31??數值\
?????文件???????????9??2016-10-21?20:26??數值\in.txt
?????文件??????????54??2016-10-18?20:24??數值\LU分解in.txt
?????文件?????????443??2016-10-24?18:31??數值\LU分解out.txt
?????文件???????????0??2016-10-05?11:01??數值\LU分解法.ASP
?????文件????????5158??2016-10-24?18:31??數值\LU分解法.CPP
?????文件????????3427??2016-10-24?18:30??數值\LU分解法.DSP
?????文件?????????524??2016-10-24?18:31??數值\LU分解法.DSW
?????文件???????41984??2016-10-24?18:31??數值\LU分解法.ncb
?????文件???????48640??2016-10-24?18:31??數值\LU分解法.OPT
?????文件?????????762??2016-10-24?18:31??數值\LU分解法.PLG
?????文件??????????87??2016-10-24?18:57??數值\列主元in.txt
?????文件??????????50??2016-10-21?09:03??數值\列主元in1.txt
?????文件??????????75??2016-10-24?20:22??數值\列主元out.txt
?????文件????????5334??2016-10-24?20:22??數值\列主元消去.cpp
?????文件????????3451??2016-10-24?20:22??數值\列主元消去.dsp
?????文件?????????528??2016-10-24?20:22??數值\列主元消去.dsw
?????文件???????33792??2016-10-24?20:22??數值\列主元消去.ncb
?????文件???????48640??2016-10-24?20:22??數值\列主元消去.opt
?????文件?????????774??2016-10-24?20:22??數值\列主元消去.plg
?????文件????????3223??2016-10-09?12:52??數值\列主元消去法.cpp
?????文件????????3475??2016-10-21?18:42??數值\列主元消去法.dsp
?????文件?????????532??2016-10-21?18:42??數值\列主元消去法.dsw
?????文件????????5162??2016-10-18?21:44??數值\列主元消去法.h
?????文件???????41984??2016-10-21?18:42??數值\列主元消去法.ncb
?????文件???????48640??2016-10-21?18:42??數值\列主元消去法.opt
?????文件?????????898??2016-10-21?18:42??數值\列主元消去法.plg
?????文件????????5587??2016-11-27?18:24??數值\列主元第三版.cpp
?????文件????????3475??2016-11-27?18:20??數值\列主元第三版.dsp
?????文件?????????532??2016-11-27?18:24??數值\列主元第三版.dsw
?????文件???????41984??2016-11-27?18:24??數值\列主元第三版.ncb
............此處省略72個文件信息
評論
共有 條評論