C语言求不等式与等式的解

22% 2020-01-22 05:57:27
这个代码该怎么写啊
...全文
710 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
22% 2020-01-30
  • 打赏
  • 举报
回复
引用 7 楼 GKatHere的回复:


// 推理
// 0.038f + 0.46e <= 2.56*10^9 此为直线,且其一面有效
// q = f^0.4 * E^0.6 此为曲线
//  如图,当Q越大时,曲线向直线无效方向移动,故最大Q时,当为曲线与直线的相切点
double LIM_ = 2.56e9;
double getlim(double _f, double _e)
{
	return 0.038* _f + 0.46*_e;
}
double getf(double _e)
{
	return (LIM_ - 0.46*_e) / 0.038;
} 
double gete(double _f)
{
	return (LIM_ - 0.038*_f) / 0.46;
}
double getq(double _f, double _e)
{
	return pow(_f, 0.4) * pow(_e, 0.6);
}
// 此处采用 log2快速逼近
void feq()
{
	double e = 0, f=0, lim, q, lastq = -1;
	double d = 1;
	int n = 0, m = 0;
	do 
	{
		n++;
		e = gete(f+d);
		q = getq(f+d, e);
		if (!d)				// double最小极限为0
		{
			m++;
			//	如果此点处q是最大,
			//		1: 则此点为曲线直线唯一相交点,即为相切点
			//		2: 此点两侧任意点的q值必比原q小
			//		3: 如果任意一侧q值比原值大,那么此点为相交点,不是切点
			double PRI = 1e-4;		//	检测精度,太大无效,太小则double精度有限
			double fc = f + PRI;
			double ec = gete(fc);
			double qc = getq(fc, ec);
			if (qc > q)
			{
				d = PRI;
				continue;
			}
			 fc = f - PRI;
			 ec = gete(fc);
			 qc = getq(fc, ec);
			 if (qc > q)
			 {
				 d = -PRI;
				 continue;
			 }

			break;
		}
		if (q > lastq)
		{
			f += d;
			d *= 2;
			lastq = q;
		}
		else
			d /= 2;
	} while (1);

	printf("\n迭代次数:%d, %d, ", n, m);

	e = gete(f);
	lim = getlim(f, e);
	q = getq(f, e);;
	printf("\n正解:%e, %e, %e,%e", f, e, lim, q);

	double fe = f / e;
	double feq = LIM_ /( 0.038 *fe + 0.46) * pow(fe, 04);

	f = 3.339e9;
	e = 2.65e10;
	lim = getlim(f, e);
	q = getq(f, e);;
	printf("\n原解:%e, %e, %e,%e", f, e, lim, q);
}
迭代次数:2305, 2, 正解:2.688306e+010, 3.344443e+009, 2.560000e+009,7.698139e+009 原解:3.339000e+009, 2.650000e+010, 1.231688e+010,1.157162e+010 注意:原解有误, f 与e 值大误,Q值小误
你用你的代码,然后,他没有数据哇,我在前面加了一个includemath和stdio,不然运行不了
22% 2020-01-30
  • 打赏
  • 举报
回复
你用你的代码,然后,他没有数据哇,我在前面加了一个includemath和stdio,不然运行不了
GKatHere 2020-01-26
  • 打赏
  • 举报
回复


// 推理
// 0.038f + 0.46e <= 2.56*10^9 此为直线,且其一面有效
// q = f^0.4 * E^0.6 此为曲线
//  如图,当Q越大时,曲线向直线无效方向移动,故最大Q时,当为曲线与直线的相切点
double LIM_ = 2.56e9;
double getlim(double _f, double _e)
{
	return 0.038* _f + 0.46*_e;
}
double getf(double _e)
{
	return (LIM_ - 0.46*_e) / 0.038;
} 
double gete(double _f)
{
	return (LIM_ - 0.038*_f) / 0.46;
}
double getq(double _f, double _e)
{
	return pow(_f, 0.4) * pow(_e, 0.6);
}
// 此处采用 log2快速逼近
void feq()
{
	double e = 0, f=0, lim, q, lastq = -1;
	double d = 1;
	int n = 0, m = 0;
	do 
	{
		n++;
		e = gete(f+d);
		q = getq(f+d, e);
		if (!d)				// double最小极限为0
		{
			m++;
			//	如果此点处q是最大,
			//		1: 则此点为曲线直线唯一相交点,即为相切点
			//		2: 此点两侧任意点的q值必比原q小
			//		3: 如果任意一侧q值比原值大,那么此点为相交点,不是切点
			double PRI = 1e-4;		//	检测精度,太大无效,太小则double精度有限
			double fc = f + PRI;
			double ec = gete(fc);
			double qc = getq(fc, ec);
			if (qc > q)
			{
				d = PRI;
				continue;
			}
			 fc = f - PRI;
			 ec = gete(fc);
			 qc = getq(fc, ec);
			 if (qc > q)
			 {
				 d = -PRI;
				 continue;
			 }

			break;
		}
		if (q > lastq)
		{
			f += d;
			d *= 2;
			lastq = q;
		}
		else
			d /= 2;
	} while (1);

	printf("\n迭代次数:%d, %d, ", n, m);

	e = gete(f);
	lim = getlim(f, e);
	q = getq(f, e);;
	printf("\n正解:%e, %e, %e,%e", f, e, lim, q);

	double fe = f / e;
	double feq = LIM_ /( 0.038 *fe + 0.46) * pow(fe, 04);

	f = 3.339e9;
	e = 2.65e10;
	lim = getlim(f, e);
	q = getq(f, e);;
	printf("\n原解:%e, %e, %e,%e", f, e, lim, q);
}
迭代次数:2305, 2, 正解:2.688306e+010, 3.344443e+009, 2.560000e+009,7.698139e+009 原解:3.339000e+009, 2.650000e+010, 1.231688e+010,1.157162e+010 注意:原解有误, f 与e 值大误,Q值小误
apkipa1 2020-01-22
  • 打赏
  • 举报
回复
给你一个参考思路: 在前提 0.038 F + 0.46 E <= 2.56 * 10^9 下,因为求的是 Q = F^0.4 * E^0.6 的最大值,易得 F 和 E 越大越好,那么可以转化前提为0.038 F + 0.46 E == 2.56 * 10^9,可求得 F 和 E 的关系式,代入 Q 中,得到一个表达式,可通过数学方法得知其有极值,再大致预估根的位置,然后迭代求解即可。
22% 2020-01-22
  • 打赏
  • 举报
回复
引用 3 楼 apkipa1的回复:
[quote=引用 2 楼 22% 的回复:] 我不会用你说的第二个软件,我想看看C语言代码怎么写这种题,怎么得到答案
题目是什么?从你的图片里完全看不出。你应该精确地定义一下。[/quote] 就是最上面的两个式子,求最大Q值,得出下面三个结果
apkipa1 2020-01-22
  • 打赏
  • 举报
回复
引用 2 楼 22% 的回复:
我不会用你说的第二个软件,我想看看C语言代码怎么写这种题,怎么得到答案
题目是什么?从你的图片里完全看不出。你应该精确地定义一下。
22% 2020-01-22
  • 打赏
  • 举报
回复
引用 1 楼 apkipa1的回复:
看不懂,你是想用 C 语言计算 Mathematica 表达式还是直接求解这些式子?
我不会用你说的第二个软件,我想看看C语言代码怎么写这种题,怎么得到答案
apkipa1 2020-01-22
  • 打赏
  • 举报
回复
看不懂,你是想用 C 语言计算 Mathematica 表达式还是直接求解这些式子?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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