C++二元非线性方程组
二元非线性方程牛顿迭代法C++代码。
小弟需要解一个二元非线性方程组,虽然说matlab 的解法是一两个代码的事,但是我的情况是需要在C++ 里面实现。 由于自己不熟悉C++代码和牛顿迭代法的解法,小弟最近在网上找了一些资料。发现很多有问题的例子,纯粹是在误导别人,浪费别人的时间。于是小弟自己在看了解法(牛顿迭代法)的基础上,自己通过C++ 语言实现了一些简单方程组的解法,分享给给大家。
1. 非线性方程组的解法原理
我在网上找了一个资料,应该是中南大学计算机学院的教程,如下:
注意,他这里的例子第二个方程应该是,x1*x2*x2+x1-10*x2+8
经过观察,我发现其实对于2元方程来说:f(x1,x2)和g(x1,x2)。牛顿迭代法里面的迭代量(Δx 1 和Δx 2) 可以如下表示。(我看到网上很多例子用矩阵来表示,我表示看不太懂,而且根据网上贴出来的程序,发现有错误。而我发现对于2元方程来说,用下面的表示方法更直观,更简单。2元方程并不需要再学习矩阵的相关知识。)
∆x 1=-f (x 1, x 2) ∂f x 1, x 2∂f x 1, x 2+∂x 1∂x 2
∆x 2=-g (x 1, x 2) 1212+∂x 1∂x 2
2. 代码 (运行环境, VS 2010, WIN 7 64)
// Nonlinear.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// 迭代 delta_x1 = -function_F/(F_x1+F_x2); // 方程组, f(x1,x2), g(x1,x2) function_F = x1_0*x1_0-10.0*x1_0+x2_0*x2_0+8.0; // 10.0的意思是double 类型,10 是 function_G = x1_0*x2_0*x2_0+x1_0-10.0*x2_0+8.0; // 偏导, F_x1 = 2.0*x1_0-10.0; F_x2 = 2.0*x2_0; G_x1 = x1_0*x1_0+1.0; G_x2 = 2.0*x1_0*x2_0-10.0; for (Steps=1;Steps
} delta_x2 = -function_G/(G_x1+G_x2); x1_1 = x1_0 + delta_x1; x2_1 = x2_0 + delta_x2; x1_0 = x1_1; //迭代,将新计算的变量赋值给原始变量 x2_0 = x2_1; Error_cout = fabs(delta_x1)+fabs(delta_x2); if (Error_cout
运行结果为:
当然,对于有些方程用这个方法是解不了的,大家可以查一下阻尼牛顿法!