// 非线性方程e对未知数n求偏微分,未知数n从0开始计数 private NonlinearEquation PartialDifferential(NonlinearEquation e, int n) { NonlinearEquation result = new NonlinearEquation(e.theUnknowNum); for (int i = 0; i < e.theUnknowNum; i++) { if (i != n) { result.theCoefficient[i] = 0; result.thePower[i] = 0; } } if (e.thePower[n] > 1) { result.thePower[n] = e.thePower[n] - 1; // 降次 result.theCoefficient[n] = e.theCoefficient[n] * e.thePower[n]; // 系数乘以次数 result.theConstant = 0; // 常数项归零 } else { //降次后变成常数项 result.thePower[n] = 1; // 次数归1 result.theCoefficient[n] = 0; // 系数归0 result.theConstant = -e.theCoefficient[n]; // 移项 } return(result); }
// 通过非线性方程组构造牛顿迭代 public NewtonMethod(NonlinearEquations e, int uNum, int eNum, int mItera, double preci, double[] sVal) { theUnknowNum = uNum; theEquationNum = eNum; theMaxIterativeTime = mItera; thePrecision = preci; theStartValue = new double[uNum]; for (int i = 0; i < uNum; i++) { theStartValue[i] = sVal[i]; } // 构造非线性方程组 theEquations = new NonlinearEquations(); theEquations.Clear(); for (int i = 0; i < eNum; i++) { theEquations.AddEquation(e[i]); } // 构造雅各比方程组 theJacobiEquations = new NonlinearEquation[theEquationNum, theUnknowNum]; for (int i = 0; i < theEquationNum; i++) { for (int j = 0; j < theUnknowNum; j++) { theJacobiEquations[i, j] = new NonlinearEquation(theUnknowNum); theJacobiEquations[i, j] = PartialDifferential(theEquations[i], j); } } theEndValue = new double[uNum]; }
private void btnConfirm_Click(object sender, EventArgs e) { txtPrint.Text = ""; txtResult.Text = ""; txtWarn.Text = ""; if (cboUnoNum.Text == string.Empty) { txtWarn.Text = "错误!未选择未知数的个数!"; return; } unknowNum = Int32.Parse(cboUnoNum.Text); if (unknowNum == 1) { MonoHighPowerForm f0 = new MonoHighPowerForm(); f0.Owner = this; f0.ShowDialog(); if (f0.isCancelled1 == true) { txtWarn.Text = "已取消!"; return; } warning = f0.warning1; if (warning != "") { txtWarn.Text = warning; return; } try { xInit = f0.xInit1; monoCoefficient = new double[f0.itemNum]; monoCoefficient = f0.monoCoefficient1; monoPower = new int[f0.itemNum - 1]; monoPower = f0.monoPower1; monoEqua = new MonoHighPowEqua(precision, xInit, monoCoefficient, monoPower); txtPrint.Text = monoEqua.MonoEquaToString(); } catch (Exception) { txtWarn.Text = "错误!已关闭或输入格式有误!"; return; } } else { startValue = new double[unknowNum]; for (int i = 0; i < unknowNum; i++) { startValue[i] = 1; } DataInputForm f2 = new DataInputForm(); f2.Owner = this; f2.ShowDialog(); if (f2.isCancelled == true) { txtWarn.Text = "已取消!"; return; } warning = f2.warning1; if (warning != "") { txtWarn.Text = warning; return; } equationNum = f2.equationNum1; coefficient = new double[equationNum, unknowNum]; coefficient = f2.coefficient1; power = new int[equationNum, unknowNum]; power = f2.power1; constant = new double[equationNum]; constant = f2.constant1; newEquations = new NonlinearEquation[equationNum]; try { for (int i = 0; i < equationNum; i++) { newEquations[i] = new NonlinearEquation(unknowNum); for (int j = 0; j < unknowNum; j++) { newEquations[i].theCoefficient[j] = coefficient[i, j]; newEquations[i].thePower[j] = power[i, j]; } newEquations[i].theConstant = constant[i]; } equations.Clear(); equations.AddEquations(newEquations); // 构造牛顿迭代法 newton = new NewtonMethod(equations, unknowNum, equationNum, maxIterativeTime, precision, startValue); // 将方程组打印出来 for (int i = 0; i < equationNum; i++) { txtPrint.Text += equations[i].EquationToString() + "\r\n"; } } catch (Exception) { txtWarn.Text = "警告!未知错误!"; return; } } }
public void Insert(int index, NonlinearEquation currentEquation) // 插入一个新的非线性方程 { List.Insert(index, currentEquation); }
public bool Contains(NonlinearEquation currentEquation) // 查看该方程是否在方程组中 { return(List.Contains(currentEquation)); }
public int IndexOf(NonlinearEquation currentEquation) // 确定方程在方程组中的索引 { return(List.IndexOf(currentEquation)); }
public void Remove(NonlinearEquation oldEquation) // 移除一个非线性方程 { List.Remove(oldEquation); }
public void AddEquation(NonlinearEquation newEquation) // 添加一个非线性方程 { List.Add(newEquation); }