C++题目,急求!拜托各位帮帮忙~

Caroline 2011-03-21 02:36:58

不要意思,题目有点长,但是希望大家还是能帮帮忙吧~谢谢了
...全文
221 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphiwcdj 2011-03-21
  • 打赏
  • 举报
回复
问题是当要求精度非常高的时候,考虑使用数组存储或者用其他无精度限制的语言,比如,python
delphiwcdj 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 delphiwcdj 的回复:]

引用 1 楼 coding_hello 的回复:

你这也太懒了,好歹把第一问的代码写出来啊,一个多项式求和的函数能复杂到哪去。。。
第一问出来了,第二问就简单啦,求导是吧。。。
都能求导了,第三问的牛顿法计算近似解那也就不难了。。不过这个精度还真是有点高,要到0.0000000001


根据牛顿法即是求迭代的过程
例如 p(x)=-x^4+5x^3 求导可得: p'(x)=-……
[/Quote]

#include <cstdio>
#include <cmath>

int calc_iter_num(int level)
{
static int cnt = 1, i = 1;
return (i*=2) < level ? ++cnt, calc_iter_num(level) : ++cnt;
}
double p(double x)
{
return -1*pow(x,4)+5*pow(x,3);
}
double p_d(double x)
{
return -4*pow(x,3)+15*pow(x,2);
}

int main()
{
int level =10, iter_num = 0;
double res = 0.0, x1 = (-1+3)/2, x2 = 0.0;// double最高15位有效数字
iter_num = calc_iter_num(level);
for (int i=0; i<iter_num; ++i)
{
x2 = x1 - p(x1)/p_d(x1);
x1 = x2;
}
res = x2;// 0.11866847588281010
printf("%.10lf\n", p(res));// 0.0081572617
}
delphiwcdj 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 coding_hello 的回复:]

你这也太懒了,好歹把第一问的代码写出来啊,一个多项式求和的函数能复杂到哪去。。。
第一问出来了,第二问就简单啦,求导是吧。。。
都能求导了,第三问的牛顿法计算近似解那也就不难了。。不过这个精度还真是有点高,要到0.0000000001
[/Quote]

根据牛顿法即是求迭代的过程
例如 p(x)=-x^4+5x^3 求导可得: p'(x)=-4x^3+15x^2
再根据迭代公式 x(n+1) = x(n) - f(x(n))/f'(x(n))依次求近似解
取x0= (-1+3)/2 =1
p'(1) = -4+15 = 9
x1=x0-p(x0)/p'(x0)= 0.6363636363634
x2=x1-p(x1)/p'(x1)= ……
每迭代一次,牛顿法结果的有效数字将增加一倍,一直得到需要的精度为止,比如题目中是10^10,迭代5次即可
赵4老师 2011-03-21
  • 打赏
  • 举报
回复
英语也是一门计算机语言。
临时救急用谷歌翻译。
xgy8705023 2011-03-21
  • 打赏
  • 举报
回复
英语不行
tulipcaicai 2011-03-21
  • 打赏
  • 举报
回复
英语不给力,帮不上你啦
smillyz 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 witwolf 的回复:]
引用 1 楼 coding_hello 的回复:

你这也太懒了,好歹把第一问的代码写出来啊,一个多项式求和的函数能复杂到哪去。。。
第一问出来了,第二问就简单啦,求导是吧。。。
都能求导了,第三问的牛顿法计算近似解那也就不难了。。不过这个精度还真是有点高,要到0.0000000001

+1
[/Quote]
就是
witwolf 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 coding_hello 的回复:]

你这也太懒了,好歹把第一问的代码写出来啊,一个多项式求和的函数能复杂到哪去。。。
第一问出来了,第二问就简单啦,求导是吧。。。
都能求导了,第三问的牛顿法计算近似解那也就不难了。。不过这个精度还真是有点高,要到0.0000000001
[/Quote]
+1
pjl1119 2011-03-21
  • 打赏
  • 举报
回复
应该不难吧。。
野男孩 2011-03-21
  • 打赏
  • 举报
回复
你这也太懒了,好歹把第一问的代码写出来啊,一个多项式求和的函数能复杂到哪去。。。
第一问出来了,第二问就简单啦,求导是吧。。。
都能求导了,第三问的牛顿法计算近似解那也就不难了。。不过这个精度还真是有点高,要到0.0000000001

xali 2011-03-21
  • 打赏
  • 举报
回复
不过我看原来的英文的意思是,当遇到导数为0,值不为0的情况,应该会分别去两边寻找,即将[a,b]在导数为0点分成[a,x][x,b]再分别找。而上面的程序是要求保证[a,b]间有根,找到一个实根即可。
xali 2011-03-21
  • 打赏
  • 举报
回复
/* 牛顿法解多项式的根
输入:多项式系数c[],多项式度数n,求在[a,b]间的根
输出:根
要求保证[a,b]间有根
*/
#include "stdio.h"
#include "stdlib.h"

//第一道题:
double poly(int deg, double x, double coeff [])
{
int i;
double p = coeff[deg];

for (i=deg; i>0; i--)
p = p*x + coeff[i-1];
return p;
}

//第二道题:求导数
void polyder (int deg, double coeff[], double dercoeff[])
{
int i;
for (i=deg-1; i>=0; i--) {
dercoeff[i] = (i+1)*coeff[i+1];
}
}

double fabs( double x )
{
return (x<0)? -x : x;
}

//牛顿法函数
int newton(double x0, double *r,
double coeff[], double dercoeff[], int deg,
double a, double b, double eps)
{
int MAX_ITERATION = 1000;
int i = 1;
double x1, x2, fp, eps2 = eps/10.0;

x1 = x0;
while (i < MAX_ITERATION) {
x2 = poly(deg, x1, coeff);
fp = poly(deg-1, x1, dercoeff);
if ((fabs(fp)<0.0000000001) && (fabs(x2)>1.0))
return 0;
x2 = x1 - x2/fp;
if (fabs(x1-x2)<eps2) {
if (x2<a || x2>b)
return 0;
*r = x2;
return 1;
}
x1 = x2;
i++;
}
return 0;
}

double Polynomial_Root(double coeff[], int deg, double a, double b, double eps)
{
double *dercoeff;
int i;
double root;

/*dercoeff = (double *)calloc(deg, sizeof(double));
for (i=deg-1; i>=0; i--) {
dercoeff[i] = (i+1)*coeff[i+1];
}*/
dercoeff = (double *)calloc(deg, sizeof(double));
polyder (deg, coeff, dercoeff);

if (a>b) {
root = a; a = b; b = root;
}
if ((!newton(a, &root, coeff, dercoeff, deg, a, b, eps)) &&
(!newton(b, &root, coeff, dercoeff, deg, a, b, eps)))
newton((a+b)*0.5, &root, coeff, dercoeff, deg, a, b, eps);
free(dercoeff);
if (fabs(root)<eps)
return fabs(root);
else
return root;
}

//p(x)= -x^4 + 5x^3, [a,b]=[-1,3]
//和p(x)= x^2 -3x +2,[a,b]=[1,5]
void main()
{
double a,b,x;
double *coeff;

//p(x)= -x^4 + 5x^3, [a,b]=[-1,3]
coeff = (double *)calloc(5, sizeof(double));
coeff[4]= -1;coeff[3]= 5;coeff[2]= 0;coeff[1]= 0;coeff[0]= 0;
x=Polynomial_Root(coeff, 4, -1, 3, 0.0000000001);
printf("x=%lf\n",x);
free(coeff);

//p(x)= x^2 -3x +2,[a,b]=[1,5]//wu值
coeff = (double *)calloc(3, sizeof(double));
coeff[2]= 1;coeff[1]= -3;coeff[0]= 2;
x=Polynomial_Root(coeff, 2, 1, 5, 0.0000000001);
printf("x=%lf\n",x);
free(coeff);

//p(x)= x^2 +2x +1,[a,b]=[-2,2]
coeff = (double *)calloc(3, sizeof(double));
coeff[2]= 1;coeff[1]= 2;coeff[0]= 1;
x=Polynomial_Root(coeff, 2, -2, 2, 0.0000000001);
printf("x=%lf\n",x);
free(coeff);
}
结果:
x=0.000000
x=1.000000
x=-1.000000
请按任意键继续. . .
xali 2011-03-21
  • 打赏
  • 举报
回复
//第一道题:
double poly(int deg, double x, double coeff [])
{
int i;
double p = coeff[deg];

for (i=deg; i>0; i--)
p = p*x + coeff[i-1];
return p;
}

//第二道题:求导数
int polyder (int deg, double coeff[], double dercoeff[])
{
int i;
for (i=deg; i>0; i--)
{
dercoeff[i-1] = coeff[i]*i
}
return deg-1;//最高次方减1
}
xali 2011-03-21
  • 打赏
  • 举报
回复
找到个资料,大家先研究下:
/* 牛顿法解多项式的根
输入:多项式系数c[],多项式度数n,求在[a,b]间的根
输出:根
要求保证[a,b]间有根
*/

double fabs( double x )
{
return (x<0)? -x : x;
}

double f(int m, double c[], double x)
{
int i;
double p = c[m];

for (i=m; i>0; i--)
p = p*x + c[i-1];
return p;
}

int newton(double x0, double *r,
double c[], double cp[], int n,
double a, double b, double eps)
{
int MAX_ITERATION = 1000;
int i = 1;
double x1, x2, fp, eps2 = eps/10.0;

x1 = x0;
while (i < MAX_ITERATION) {
x2 = f(n, c, x1);
fp = f(n-1, cp, x1);
if ((fabs(fp)<0.000000001) && (fabs(x2)>1.0))
return 0;
x2 = x1 - x2/fp;
if (fabs(x1-x2)<eps2) {
if (x2<a || x2>b)
return 0;
*r = x2;
return 1;
}
x1 = x2;
i++;
}
return 0;
}

double Polynomial_Root(double c[], int n, double a, double b, double eps)
{
double *cp;
int i;
double root;

cp = (double *)calloc(n, sizeof(double));
for (i=n-1; i>=0; i--) {
cp[i] = (i+1)*c[i+1];
}
if (a>b) {
root = a; a = b; b = root;
}
if ((!newton(a, &root, c, cp, n, a, b, eps)) &&
(!newton(b, &root, c, cp, n, a, b, eps)))
newton((a+b)*0.5, &root, c, cp, n, a, b, eps);
free(cp);
if (fabs(root)<eps)
return fabs(root);
else
return root;
}
xuezt 2011-03-21
  • 打赏
  • 举报
回复
good test

64,678

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧