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++很快得到这个方程的解呢?
最好是学过数值计算的同学解答。因为关系到运行时间,想最快得到解。谢谢。
展开
 我来答
百度网友a8b798b
2017-10-15 · TA获得超过177个赞
知道小有建树答主
回答量:129
采纳率:33%
帮助的人:111万
展开全部

代码,思路,注释都在这儿了。望采纳。

#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);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式