用牛顿法求解非线性方程组,给出C++代码
时间: 2023-09-25 10:13:17 浏览: 261
用牛顿迭代法求解非线性方程组
4星 · 用户满意度95%
好的,下面是使用牛顿法求解非线性方程组的C++代码:
```c++
#include <iostream>
#include <cmath>
#define eps 1e-8 // 精度控制
using namespace std;
int n; // 未知量个数
double x[100], f[100][100], ans[100]; // x为解向量,f为方程组,ans为方程组解
double func(int i) // 方程组的第i个方程
{
double res = 0;
for (int j = 1; j <= n; j++)
res += f[i][j] * x[j];
return res - f[i][0];
}
double func_deriv(int i, int j) // 方程组第i个方程对x[j]的偏导数
{
double res = 0;
for (int k = 1; k <= n; k++)
res += f[i][k] * (j == k ? 1 : 0);
return res;
}
void newton() // 牛顿法求解
{
int k = 0;
while (true) {
double maxx = 0;
for (int i = 1; i <= n; i++) {
double fi = func(i);
maxx = max(maxx, abs(fi));
for (int j = 1; j <= n; j++) {
double fij = func_deriv(i, j);
x[j] -= fi / fij;
}
}
if (maxx < eps) break;
k++;
}
for (int i = 1; i <= n; i++)
ans[i] = x[i];
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n + 1; j++)
cin >> f[i][j];
for (int i = 1; i <= n; i++)
x[i] = 0;
newton();
for (int i = 1; i <= n; i++)
cout << ans[i] << ' ';
cout << endl;
return 0;
}
```
其中,输入的第一个数为未知量个数$n$,接下来$n$行为方程组的$n$个方程,每行$n+1$个数,前$n$个数为方程组的系数,最后一个数为方程组等号右边的常数。程序最后输出方程组的解。
阅读全文