㈠ 用黄金分割法求f(x)=(x-3)²的最优解 附C语言程序
黄金分割法其实也是Fibonacci法吧!!!因为对于Fibonacci数列,有f(n)/f(n-1)-→0.618......
这题解法我是参考http://hi..com/shyyooeren/blog/item/d74f42104e8ef9f9c2ce7902.html,
只是改了多项式和Fibonacci数列用黄金分割数来求而已(需要改的还有x的范围(a,b))!
#include<stdio.h>
#include
<math.h>
const
int
fi[10]={1,1,2,3,5,8,13,21,34,55};
double
f(double
x)
//多项式
{
return
(x-3)*(x-3);
}
double
F(int
tn)//计算Fibonacci数
{
if(tn<10)
return
fi[tn];
return
pow(1.618,tn-9)*fi[9];
}
void
main(void)
{
double
r,u,a,b,fr,fu,q;
int
k,n;
//步骤1,初始化
a=0.0;
b=3.0;
k=0;
q=0.00001;
n=0;
while(F(n)<((b-a)/q))n++;
//计算次数n
r=a+(F(n-k-1)/F(n-k+1))*(b-a);
u=a+(F(n-k)/F(n-k+1))*(b-a);
fr=f(r);
fu=f(u);
while(k<n)
{
if(fr>fu)
{
if(b-r<=q)
{
printf("%d:%f",k,u);
break;
}
else
{
a=r;
b=b;
r=u;
fr=fu;
u=a+(F(n-k)/F(n-k+1))*(b-a);
fu=f(u);
k++;
}
}
else
{
if(u-a<=q)
{
printf("%d:%f",k,r);
break;
}
else
{
a=a;
b=u;
u=r;
fu=fr;
r=a+(F(n-k-1)/F(n-k+1))*(b-a);
fr=f(r);
k++;
}
}
}
getchar();
}
㈡ C语言 用黄金分割法求函数的最小值和取最小值时的x
给,已经编译运行确认: #include"math.h" #include"stdio.h" #definef(x)x*x+2*x+1//一元函数,这里按照你的要求写的是:x2+2x+1 //函数功能是用黄金分割法实现求一元函数的最优解 doublehj(double*a,double*b,doublee,int*n) {doublex1,x2,s;<br>if(fabs(*b-*a)<=e)<br>s=f((*b+*a)/2);<br>else<br>{x1=*a+0.382*(*b-*a);<br>x2=*a+0.618*(*b-*a);<br>if(f(x1)>f(x2))<br>*a=x1;<br>else<br>*b=x2;<br>*n=*n+1;<br>s=hj(a,b,e,n);<br>} returns; } main() {doubles,a,b,e;<br>intn=0;<br>scanf("%lf%lf%lf",&a,&b,&e);//输入区间[a,b]和精度e的值<br>s=hj(&a,&b,e,&n);//调用hj函数,其中n代表迭代次数<br>printf("a=%lf,b=%lf,s=%lf,n=%d ",a,b,s,n);<br>} 运行时: 输入:0.60.50.1 输出结果为: 0.60.50.1 a=0.600000,b=0.500000,s=2.402500,n=0
㈢ 用C语言编写黄金分割法f(x)=x2+2x程序
#include#includefloat getequation(float x)
{
return x*x-2*x+2;
}
void main()
{
float a=0;
float b=6;
float result = 0;
do {
float c=a+0.618*(b-a);
float d=a+b-c;
if(fabs(getequation(c)) < fabs(getequation(d)))
{
a=d;
result = c;
}
else
{
b=c;
result = d;
}
} while(fabs(getequation(result)) > 0.01);
printf("f(a)=a*a-7*a+10
");
printf("a=%f
",result);
}
(3)用c语言编写黄金分割法扩展阅读
C语言编写程序求最大值
#include<stdio.h>
doubleMax(double*p,intn)
{
doublemax=*p;
for(inti=0;i<n;i++)
if(*(p+i)>max)
max=*(p+i);
returnmax;
}
doubleMin(double*p,intn)
{
doublemin=*p;
for(inti=0;i<n;i++)
if(*(p+i)<min)
min=*(p+i);
returnmin;
}
doubleAverage(double*p,intn)
{
doublesum=0;
for(inti=0;i<n;i++)
sum+=*(p+i);
returnsum/n;
}
intmain()
{
doublea[10];
printf("请输入10个实数:
");
for(inti=0;i<10;i++)
scanf("%f",&a[i]);
printf("这10个数中最大值为:%f
",Max(a,10));
printf("这10个数中最小值为:%f ",Min(a,10));
printf("这10个数的平均值为:%f
",Average(a,10));
return0;
㈣ C语言求两个点的黄金分割;C语言计算题(2,3两题)
#include <stdio.h>
int main()
{
float x1,y1,x2,y2;
scanf("%f%f%f%f",&x1,&y1,&x2,&y2);
printf("%f %f",(x1+x2)*0.618,(y1+y2)*0.618);
return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
double x=sqrt(1+1.0/(1*2)+1.0/(1*2*3));
double y=pow(asin(1),x);
double z=log(pow(x,2)+y)/(pow(sin(x*y),2)+1);
printf("%lf ",z);
return 0;
}
㈤ 用黄金分割法求f(x)=(x-3)的最优解 附C语言程序
黄金分割法其实也是Fibonacci法吧!!!因为对于Fibonacci数列,有f(n)/f(n-1)-→0.618...... 这题解法我是参考http://hi..com/shyyooeren/blog/item/d74f42104e8ef9f9c2ce7902.html, 只是改了多项式和Fibonacci数列用黄金分割数来求而已(需要改的还有x的范围(a,b))! #include<stdio.h> #include <math.h> const int fi[10]={1,1,2,3,5,8,13,21,34,55}; double f(double x) //多项式 { return (x-3)*(x-3); } double F(int tn)//计算Fibonacci数 { if(tn<10) return fi[tn]; return pow(1.618,tn-9)*fi[9]; } void main(void) { double r,u,a,b,fr,fu,q; int k,n; //步骤1,初始化 a=0.0; b=3.0; k=0; q=0.00001; n=0; while(F(n)<((b-a)/q))n++; //计算次数n r=a+(F(n-k-1)/F(n-k+1))*(b-a); u=a+(F(n-k)/F(n-k+1))*(b-a); fr=f(r); fu=f(u); while(k<n) { if(fr>fu) { if(b-r<=q) { printf("%d:%f",k,u); break; } else { a=r; b=b; r=u; fr=fu; u=a+(F(n-k)/F(n-k+1))*(b-a); fu=f(u); k++; } } else { if(u-a<=q) { printf("%d:%f",k,r); break; } else { a=a; b=u; u=r; fu=fr; r=a+(F(n-k-1)/F(n-k+1))*(b-a); fr=f(r); k++; } } } getchar(); }
㈥ C语言编程,用黄金分割法求f(a)=a*a-7*a+10的最优解。设初始值a0=0,初始步长h=1,取迭代精度=0.35。急…
#include <stdio.h>
#include <math.h>
float GetEquation(float x)
{
return x*x-7*x+10;
}
void main()
{
float a=0;
float b=6;
float result = 0;
do {
float c=a+0.618*(b-a);
float d=a+b-c;
if(fabs(GetEquation(c)) < fabs(GetEquation(d)))
{
a=d;
result = c;
}
else
{
b=c;
result = d;
}
} while(fabs(GetEquation(result)) > 0.01);
printf("f(a)=a*a-7*a+10\n");
printf("a=%f\n",result);
}
㈦ 用c语言编写黄金分割法
黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,用分数表示为(√5-1)/2。黄金分割点(p)的求法,如图:①过点B作BD⊥AB,使BD=1/2AB;②连结AD,以D为圆心,CB为半径作弧,交AD于E,...
㈧ c语言编程:用黄金分割法求 minf(x)=x2+2x+1 急!!!!
给,已经编译运行确认:
#include "math.h"
#include "stdio.h"
#define f(x) x*x+2*x+1 //一元函数,这里按照你的要求写的是:x2+2x+1
//函数功能是用黄金分割法实现求一元函数 的最优解
double hj(double *a,double *b,double e,int *n)
{ double x1,x2,s;
if(fabs(*b-*a)<=e)
s=f((*b+*a)/2);
else
{ x1=*a+0.382*(*b-*a);
x2=*a+0.618*(*b-*a);
if(f(x1)>f(x2))
*a=x1;
else
*b=x2;
*n=*n+1;
s=hj(a,b,e,n);
}
return s;
}
main()
{ double s,a,b,e;
int n=0;
scanf("%lf %lf %lf",&a,&b,&e); // 输入区间[a,b]和精度e的值
s=hj(&a,&b,e,&n); //调用hj函数,其中n代表迭代次数
printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n);
}
运行时:
输入:0.6 0.5 0.1
输出结果为:
0.6 0.5 0.1
a=0.600000,b=0.500000,s=2.402500,n=0
㈨ 用c程序写出黄金分割法缩短探索区间求最小值解法
#include<iostream.h>
#include<math.h>
/*黄金分割法求最小值的C++程序,部分变量及函数书写并不规范*/
//δ为题给精度
int n = (lnδ/ln0.618 + 1) + 1;
int i;
float f(float ai, float bi)
{
a(i + 1) = ai + 0.618(bi - ai);
return ai + 1;
}
float g(float ai, float bi)
{
b(i + 1) = ai + 0.382(bi - ai);
return b(i + 1);
}
float F(float ai, float bi)
{
//题给的f(x)函数式;
return ;
}
float A(float ai, float bi)
{
int i = 1;
float result;
L: do
{
a(i + 1) = f(float ai, float bi);
b(i + 1) = g(float ai, float bi);
float F1 = F(float ai, float bi);
float F2 = F(float a(i + 1), float b(i + 1));
ai = ai, bi = b(i + 1);
i ++;
}while(i <= n && F1 >= F2)
if(i < n)
{
B(float ai, float bi);
}
else
result = F2;
return result;
}
float B(float ai, float bi)
{
do
{
a(i + 1) = f(float ai, float bi);
b(i + 1) = g(float ai, float bi);
float F1 = F(float ai, float bi);
float F2 = F(float a(i + 1), float b(i + 1));
ai = a(i + 1), bi = bi;
i ++;
}while(i <= n && F1 <= F2)
if(i < n)
{
goto L;
}
else
result = F1;
return result;
}
void main()
{
int i = 1;
float A(float ai, float bi);
cout<<"最小值为:"<<result<<endl;
}
㈩ 用C语言编写黄金分割法f(x)=x2+2x程序
你要很精确的解吗?如果不要的话那就很简单了。
x=-3:0.00001:6;中的精度你自己选,太小了会比较慢
y=x.^2+2*x;
[n
m]=min(y);
这个返回的就是x和对应的最小值;