C++解一个一元三次方程
答案:1 悬赏:70 手机版
解决时间 2021-11-17 20:09
- 提问者网友:谁的错
- 2021-11-16 23:36
C++解一个一元三次方程
最佳答案
- 五星知识达人网友:千夜
- 2021-11-17 00:54
代码,思路,注释都在这儿了。望采纳。
#include
#include
double solve(double k) {
//输入k的值。
//设 f(x) = k*(x-1)³+x³+5/3*x²=0 (k>0)
//则 f'(x) = 3k*(x-1)^2 + 3x^2 + 10/3*x
//因为 f'(x)在(0,1)为正,所以f(x)在(0,1)为增函数。
//因此考虑牛顿法。
//牛顿法:迭代x(n+1) = x(n) - f(x)/f'(x)
//初值可设置为0或者1。
double delta = 0.0001; //精确度, 可调。
double x = 0; //初始值
double f = k*(x-1)*(x-1)*(x-1) + x*x*x+5/3*x*x; //原函数
double f_diff = 3*k*(x-1)*(x-1) + 3*x*x + 10/3*x; //导数
double nextx = x - f / f_diff; //迭代的下一步
while ( abs(nextx-x) > delta) {
x = nextx;
f = k*(x-1)*(x-1)*(x-1) + x*x*x+5/3*x*x; //原函数
f_diff = 3*k*(x-1)*(x-1) + 3*x*x + 10/3*x; //导数
nextx = x - f / f_diff; //迭代的下一步
}
return nextx;
}
int main(){
double k = 1;
double x = solve(k);//求解
double f = k*(x-1)*(x-1)*(x-1) + x*x*x+5/3*x*x;
printf("x = %lf, f(x) = %lf", x, f);
}
#include
#include
double solve(double k) {
//输入k的值。
//设 f(x) = k*(x-1)³+x³+5/3*x²=0 (k>0)
//则 f'(x) = 3k*(x-1)^2 + 3x^2 + 10/3*x
//因为 f'(x)在(0,1)为正,所以f(x)在(0,1)为增函数。
//因此考虑牛顿法。
//牛顿法:迭代x(n+1) = x(n) - f(x)/f'(x)
//初值可设置为0或者1。
double delta = 0.0001; //精确度, 可调。
double x = 0; //初始值
double f = k*(x-1)*(x-1)*(x-1) + x*x*x+5/3*x*x; //原函数
double f_diff = 3*k*(x-1)*(x-1) + 3*x*x + 10/3*x; //导数
double nextx = x - f / f_diff; //迭代的下一步
while ( abs(nextx-x) > delta) {
x = nextx;
f = k*(x-1)*(x-1)*(x-1) + x*x*x+5/3*x*x; //原函数
f_diff = 3*k*(x-1)*(x-1) + 3*x*x + 10/3*x; //导数
nextx = x - f / f_diff; //迭代的下一步
}
return nextx;
}
int main(){
double k = 1;
double x = solve(k);//求解
double f = k*(x-1)*(x-1)*(x-1) + x*x*x+5/3*x*x;
printf("x = %lf, f(x) = %lf", x, f);
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯