(1)先对某一网格点设一初值,这个初值完全可以任意给定,称为初值电位。虽然,问题的最终结果与初值无关,但初值选择估计得当,则计算步骤会得到简化。(当利用计算机来实现迭代计算时,为了简化程序初值电位一般可取为零值)。
(2)初值电位给定后,按一个固定顺序(点的顺序是从左到右,从下到上)依次计算每点的电位,即利用(2.19)式,用围绕它的四个点的电位的平均值作为它的新值,当所有毁戚的点计算完后,用它们的新值代替旧值,即完成了一次迭代。然后再进行下一次迭代,直到每一点计算的新值和旧值之差小于指定的范围为止。
简单迭代法的特点是用前一次迭代得到的网络点电位作为下一次迭代时的初值。
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根祥余猜公式,因此求精确根非常困难,甚至不可能,从而寻找方程谨型的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
迭代法计算信道容量嫌握搭C++程序#include <iostream>
#include <vector>
#include <cfloat>
#include <cmath>
using namespace std
#define FLOAT_MINUS_PRECISION 0.00001
typedef vector<float*>VEC_PFLOAT
//迭代计算信道容芹拿量,参数值为信源,信宿符号个数和信道转移概率矩阵,返回信道容量
float GetCapacity(int nSourceSymbol,int nHostSymbol,const VEC_PFLOAT&vTransMatrix)
{
//信道容量初始化为最小值
float fCapacity = FLT_MIN
//信源概率分布
float *pfSoureProb = new float[nSourceSymbol]
//初始化信源分布为均匀分布
int i
for (i = 0i <nSourceSymboli++)
{
pfSoureProb[i] = 1.0 / nSourceSymbol
}
//初始化φ函数
VEC_PFLOAT vPhi
for (i = 0i <nSourceSymboli++)
{
float *pfTemp = new float[nHostSymbol]
vPhi.push_back(pfTemp)
}
//设置精度
const float cfDelta = 0.02f
float fPrecision
//迭代计算
int j,k
float *pfSum = new float[nSourceSymbol]
do
{
for (i = 0i <nSourceSymboli++)
{
for (j = 0j <nHostSymbolj++)
{
//计算ΣPi*Pji
float fSum = 0.0f
for (k = 0k <nSourceSymbolk++)
{
fSum += pfSoureProb[i] * vTransMatrix[k][i]
}
vPhi[i][j] = pfSoureProb[i] * vTransMatrix[j][i] / fSum
}
}
float fSumDeno = 0.0f //分母皮派求和
for (i = 0i <nSourceSymboli++)
{
float fSum = 0.0f
for (j = 0j <nHostSymbolj++)
{
fSum += vTransMatrix[j][i] * logf(vPhi[i][j])
}
pfSum[i] = expf(fSum)
fSumDeno += pfSum[i]
}
for (i = 0i <nSourceSymboli++)
{
pfSoureProb[i] = pfSum[i] / fSumDeno
}
//计算新一轮的容量
float fNewC = logf(fSumDeno)
//计算精度
fPrecision = fabs(fNewC - fCapacity) / fCapacity
fCapacity = fNewC
} while(fPrecision - cfDelta >0.0f)
//释放临时资源...
delete []pfSum
for (i = 0i <vPhi.size()i++)
{
float* pfTemp = vPhi.at(i)
delete pfTemp
}
vPhi.clear()
return fCapacity
}
int main()
{
//转移矩阵
VEC_PFLOAT vTransMatrix
int nCol,nLine
cout<<"请输入信源符号个数:"
cin>>nLine
cout<<"请输入信宿符号个数:"
cin>>nCol
cout<<"请依次输入"<<"行信道转移概率矩阵:(以空格隔开每个概率)\n"
for (int i = 0i <nLinei++)
{
float *pfTemp = new float[nCol]
Label1:
float fSum = 0.0f
cout<<"X"<<":"
for (int j = 0j <nCol - 1j++)
{
cin>>pfTemp[j]
fSum += pfTemp[j]
}
if (1.0f - fSum <0)
{
cout<<"转移概率和应该为1,请重新输入!\n"
goto Label1
}
else
{
pfTemp[j] = 1.0f - fSum
cout<<"信源符号X"<<"的转移概率分别为:"
for(int k = 0k <nColk++)
cout<<pfTemp[k]
cout<<"\n"
}
vTransMatrix.push_back(pfTemp)
}
cout<<"信道容量为:"
for (int k = 0k <vTransMatrix.size()k++)
{
float* pfTemp = vTransMatrix.at(k)
delete pfTemp
}
vTransMatrix.clear()
return 0
}
看看对你有帮助吧!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)