
C++解一个一元三次方程
假设k是个意志量k*(x-1)³+x³+5/3*x²=0(k>0)用C++求解x,精度的话...大概0.01吧。这个方程只有一个实数解,但是...
假设k是个意志量
k*(x-1)³+x³+5/3*x²=0 (k>0)
用C++求解x,精度的话...大概0.01吧。这个方程只有一个实数解,但是解析解表达式比较复杂。另外 (0<x<1)这个附加条件也可以使用。
怎么用C++很快得到这个方程的解呢?
最好是学过数值计算的同学解答。因为关系到运行时间,想最快得到解。谢谢。 展开
k*(x-1)³+x³+5/3*x²=0 (k>0)
用C++求解x,精度的话...大概0.01吧。这个方程只有一个实数解,但是解析解表达式比较复杂。另外 (0<x<1)这个附加条件也可以使用。
怎么用C++很快得到这个方程的解呢?
最好是学过数值计算的同学解答。因为关系到运行时间,想最快得到解。谢谢。 展开
展开全部
代码,思路,注释都在这儿了。望采纳。
#include <stdio.h>
#include <cmath>
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);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询