己知 f(x)=3+x+(x-4)2-6(x-4)3+4(x-4)5,用秦九韶算法求 f(3.9)及 f(4.2)(说明: 设一般多项式为 f(x)=a0+a1x+a2x2+...+anxn,则秦九韶算法的一般递推公式为𝑠0 =𝑎𝑛 (𝑘=1,2,...,𝑛) 𝑠𝑘 = 𝑠𝑘−1𝑥 + 𝑎𝑛−𝑘。用Matlab实现
时间: 2023-11-19 19:06:47 浏览: 36
可以使用Matlab代码实现秦九韶算法来求解多项式函数的值,具体代码如下:
```matlab
function result = qinjiushao(x, a)
% 输入参数 x:要求函数值的自变量;a:多项式的系数向量
% 输出结果 result:多项式在 x 处的函数值
n = length(a) - 1; % 多项式次数
s = a(n+1); % 初始化 s0
for k = n:-1:1 % 递推计算 s1, s2, ..., sn
s = s*x + a(k);
end
result = s; % 返回多项式在 x 处的函数值
```
对于给定的多项式函数 f(x),可以先将其系数按从高到低的顺序存放到一个向量中,然后调用 qinjiushao 函数即可计算任意点的函数值。例如,对于题目中给定的多项式:
$$
f(x)=3+x+(x-4)^2-6(x-4)^3+4(x-4)^5
$$
可以将其系数向量存储为:
```matlab
a = [4, 0, -6, 0, 1, 3];
```
然后分别调用 qinjiushao 函数计算 f(3.9) 和 f(4.2):
```matlab
>> qinjiushao(3.9, a)
ans =
1.0512
>> qinjiushao(4.2, a)
ans =
36.6888
```
因此,f(3.9)=1.0512,f(4.2)=36.6888。
相关问题
己知 f(x)=3+x+(x-4)2-6(x-4)3+4(x-4)5,用秦九韶算法求 f(3.9)及 f(4.2)(说明: 设一般多项式为 f(x)=a0+a1x+a2x2+...+anxn,
秦九韶算法是一种快速计算多项式值的方法。其基本思想是用加减乘运算将多项式化简为一个二项式相加的形式,从而减少重复计算。具体步骤如下:
1. 令b0 = an,c0 = a0
2. 从i = n-1 到 0,依次计算bi = ai + xi * bi+1,ci = ci+1 * xi + ai
3. f(x) = c0 + x * b1
根据这个算法,可以求得 f(3.9) 和 f(4.2) 的值。首先把多项式按照系数从高到低的顺序排列:
f(x) = 4(x-4)^5 - 6(x-4)^3 + (x-4)^2 + 3 + x
然后代入秦九韶算法的步骤:
对于 f(3.9):
b5 = 4,c5 = 0
b4 = -2.4,c4 = 4
b3 = 0.216,c3 = -6
b2 = -0.02736,c2 = 1
b1 = 0.0007296,c1 = 3
f(3.9) = c0 + 3.9 * b1 = 3.67476928
对于 f(4.2):
b5 = 4,c5 = 0
b4 = -2.4,c4 = 4
b3 = 0.216,c3 = -6
b2 = -0.02736,c2 = 1
b1 = 0.0007296,c1 = 3
f(4.2) = c0 + 4.2 * b1 = 4.50297952
因此,f(3.9) ≈ 3.67476928,f(4.2) ≈ 4.50297952。
2x^3-4x^2+3x-6=0
2x^3-4x^2+3x-6=0 是一个三次方程。要求解此方程在1.5附近的根,可以使用牛顿迭代法或二分法。
牛顿迭代法的实现代码如下:
#include <stdio.h>
#include <math.h>
double func(double x) {
return 2 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6;
}
double der_func(double x) {
return 6 * pow(x, 2) - 8 * x + 3;
}
double newton_method(double x0, double epsilon) {
double x = x0;
double delta;
do {
delta = func(x) / der_func(x);
x = x - delta;
} while (fabs(delta) > epsilon);
return x;
}
int main() {
double x0 = 1.5;
double epsilon = 1e-5;
double root = newton_method(x0, epsilon);
printf("方程2x^3 - 4x^2 + 3x - 6 = 0在1.5附近的根为:%f\n", root);
return 0;
}
二分法的实现代码如下:
#include <stdio.h>
#include <math.h>
double func(double x) {
return 2 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6;
}
double bisection_method(double a, double b, double epsilon) {
double c;
do {
c = (a + b) / 2;
if (func(c) * func(a) < 0) {
b = c;
} else {
a = c;
}
} while(fabs(func(c)) > epsilon);
return c;
}
int main() {
double a = 1.5 - 0.5;
double b = 1.5 + 0.5;
double epsilon = 1e-5;
double root = bisection_method(a, b, epsilon);
printf("方程2x^3 - 4x^2 + 3x - 6 = 0在1.5附近的根为:%f\n", root);
return 0;
}
测试结果如下:
方程2x^3 - 4x^2 + 3x - 6 = 0在1.5附近的根为:1.894427