| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 446 人关注过本帖
标题:新手求帮忙看一下外推法加格点法求函数最小值为什么数字输入大了就错
只看楼主 加入收藏
武理基械佬
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
新手求帮忙看一下外推法加格点法求函数最小值为什么数字输入大了就错
小点的数值都还好,老师要求6位以内都要对,我一个机械的真心弄得人都要傻了。大神帮忙给瞅一下。我真的心好累,本来就是一个忽悠的实验但是老师较真了求帮忙

#include<stdio.h>
double f(double t)
{ float z;
  z=t*t-10*t+36;
  return z;
}                                                         
void main()
{float h,a1,a2,a3,y1,y2,y3;
printf("请输入h,a1的值\n");
scanf("%f %f",&h,&a1);
y1=f(a1);
a2=a1+h;
y2=f(a2);
 if(y2>y1)
{
 h=-h;a3=a1;y3=y1;
 a1=a2;y1=y2;a2=a3;y2=y3;
}
 a3=a2+h;y3=f(a3);
while(y3<y2)
{
 h=2*h;
 a1=a2;y1=y2;a2=a3;y2=y3;
 a3=a2+h;y3=f(a3);
}
printf("f(%f)=%lf\nf(%f)=%lf\nf(%f)=%lf",a1,y1,a2,y2,a3,y3);


float a,b,c,E,temp;
a=a1;b=a3;
int n;
printf("请输入n,E的值\n");
scanf("%d %f",&n,&E);
double x[9999];
double y[9999];
temp=f(a1);c=a;
while((b-a)>E)
{int i;x[0]=a;
    for(i=1;i<=n;i++)
    {x[i]=x[i-1]+(b-a)/n;
    y[i]=f(x[i]);
    if(y[i]<temp)
    {temp=y[i];
    c=x[i];
    }
    }
    a=c-(b-a)/n;
    b=c+(b-a)/n;
}
printf("格点法:\n");
printf("a[m-1]=%lf,a[m]=%lf,a[m+1]=%lf,f(a[m])=%lf",a,c,b,temp);
}
2015-10-26 12:37
武理基械佬
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
收藏
得分:0 
而且数值超过四位数就有问题了,我觉得自己逻辑是对的但是就是心好累的改不了。
2015-10-26 12:38
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:20 
楼主的数据类型真乱,双精度double和单精度float都同时出演了

2015-10-28 06:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
连题目要求都没有,拽得二五八万的
2015-10-28 08:24
武理基械佬
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
收藏
得分:0 
回复 4楼 rjsp
大哥题目就是我说的外推发加格点法啊,老师给的就是这个啊。最优化技术里面的。我也想详细说题目但是没办法。。。
2015-10-29 09:37
武理基械佬
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
收藏
得分:0 
回复 3楼 hjx1120
我就大一学过c语言。而且之前全是float,后来发现不对,改了一些。原谅我其实基本不怎么会这个。
2015-10-29 09:38
武理基械佬
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
收藏
得分:0 
回复 3楼 hjx1120
我把float都换成double了 但是还是有个别数值算出来结果不对啊。例如h=481315 a1=-689745
#include<stdio.h>
double f(double t)
{ double z;
  z=t*t-10*t+36;
  return z;
}                                                         
void main()
{double h,a1,a2,a3,y1,y2,y3;
printf("请输入h,a1的值\n");
scanf("%lf %lf",&h,&a1);
y1=f(a1);
a2=a1+h;
y2=f(a2);
if(y2>y1)
{
h=-h;a3=a1;y3=y1;
a1=a2;y1=y2;a2=a3;y2=y3;
}
a3=a2+h;y3=f(a3);
while(y3<y2)
{
h=2*h;
a1=a2;y1=y2;a2=a3;y2=y3;
a3=a2+h;y3=f(a3);
}
printf("f(%f)=%lf\nf(%f)=%lf\nf(%f)=%lf",a1,y1,a2,y2,a3,y3);


double a,b,c,E,temp;
a=a1;b=a3;
int n;
printf("请输入n,E的值\n");
scanf("%ld %lf",&n,&E);
double x[9999];
double y[9999];
temp=f(a1);c=a;
while((b-a)>E)
{int i;x[0]=a;
    for(i=1;i<=n;i++)
    {x[i]=x[i-1]+(b-a)/n;
    y[i]=f(x[i]);
    if(y[i]<temp)
    {temp=y[i];
    c=x[i];
    }
    }
    a=c-(b-a)/n;
    b=c+(b-a)/n;
}
printf("格点法:\n");
printf("a[m-1]=%lf,a[m]=%lf,a[m+1]=%lf,f(a[m])=%lf",a,c,b,temp);
}
2015-10-29 09:51
武理基械佬
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-10-26
收藏
得分:0 
回复 4楼 rjsp
我其实不想回复你的,我拽什么了,学业有专科,我本科学机械的,不会就是不会,你不回答就算了,我自己已经找到答案了。倒是你回答的语气让人觉得是吃屎了,互相帮助 你不帮就别说话,我也没指名点姓的让你回答,你在这装什么比,还我拽的和二五八万一样。真特么恶心作呕
2015-11-02 11:09
快速回复:新手求帮忙看一下外推法加格点法求函数最小值为什么数字输入大了就错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037902 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved