复合辛普森积分/梯形积分(数值分析) +a littele 最小二乘法

..帮zj写的作业... 然而为什么我一点点东西又可以搞这么长时间,真是够了

真tm是看了好多东西才…… 

请问效率低下的人每天都在干什么……

#include<iostream>
#include<math.h>
using namespace std;
const double esp = 0.0001;
const double pi = 3.1415926;
double n;
double a, b;
double h;
double  f(float x) {
	//double t = sin(x);
	//竟然^不妥协的...
	
	double t = sqrt(double(4 - pow(sin(x), 2)));
	cout <<  pow(sin(x), 2);
	cout << sin(x) << endl;

return t;
}
double caltx() {
	//double y = pi / 6;
	//double t = f(0.0) + 2 * (f(1 / (6*y)) + f(1 / (y*3))) + f(1 / (y*2)) + f(2 /( y*3)) + f(5 / (y*6)) + f(y);
	//使用七个计数点
//	return ((1.0 / 2)*(1.0 / 6)*t);
	double sum=0.0;
	for (int i = 1; i < n; i++) {
		sum += f(a + i * h);//i is k
	}
	sum = (sum * 2 + f(a) + f(b)) * h/2;
	return sum;
}
double calxps() {
	//double y =pi/6;
	//double t = f(0.0) + 4 * (f(1 / (y*4)) + f(1 / (y * 2) ) + f(3 / (y * 4) )) +2*( f( 1 / (y *  3)) + f(2 /(y* 3)))+ f(y);
	//使用七个计数点
	//return ((1.0 / 3)*(1.0 / 6)*t);
	double u = 0.0;
	for (int i = 0; i < n; i++) {
		u+= f(a + i * h+0.5*h);//i is k
	}
	double v = 0.0;
	for (int i = 1; i < n; i++) {
		v += f(a + i * h);//i is k
	}
	double sum = (4*u+2*v+ f(a) + f(b)) * h / 6;
	return sum;
}
int main() {
	//double a, b, n;
	//n如果是全局变量就不用写在这里了...
	while		(cin >> a >> b >> n) {
	//a = 0; b = 0.52359877; n = 7;
	 h = (b - a) / n;//步长..
		cout << caltx() << endl;
		cout << calxps() << endl;
}
	return 0;
}

不过,哇哈哈哈上面这个是自己写的……

记住【sqrt  sin(x) pow返回值都是double】

传入的也是double... 

【在实际应用中,如果是传值到函数里,你那些变量要设为全局变量。】

【不然没有值啊……不然就是0了,这个要检查一下】(经验)

还有就是这个有公式的(都在课本上。待补充QAQ),然后积分不会写没关系啊。。他就是给你端点的值,让你在端点里面切分最后乘好步长什么的。

还有,意外的学会了word的公式编辑器……

(1)兼容模式下打开 是灰色的 直接新建复制可以

(2)插入 啊,插入……

(3)导数是上引号。。。’然后你点一个分数啊什么的,输入个f会匹配到某种math的斜体字符,然后复制一下就差不多可以了

(这就是数学卷子上那些公式来到的方法  是不是很神奇!)如图。。这个是word里面的。。



然后找到一个写的很傻 的最小二乘法...https://blog.csdn.net/morixinguan/article/details/51774394(这可是博客专家...)

由作业认识到acm的重要性.....非常复杂如果你要把数组传输进来,要把b0的值传出去,按照课本上教的要用const和星花void lsqe(const double *x, const double *y, int n, double *b1, double *b0)   

但是acm 直接给预设好了的值。。。a[20]

然后就是全局变量b0 b1直接就完了……真的是算法改变世界啊=。=


所以我说计院咸鱼400+不参加acm有什么意义...

好的吧我写的(划掉)(其实我公式看不来要不干吗从网上再找代码)(其实就也没改什么)

#include<iostream>
#include <string>
#include <math.h>
using namespace std;

double b1, b0;
double x[20];
double y[20];
void cal(int n)
{
	int  i;
	double  sumx, sumy, sumx2, sumxy;
	sumx = 0.0;
	sumy = 0.0;
	sumx2 = 0.0;
	sumxy = 0.0;
	//计算N次 
	for (i = 0; i < n; i++) {
		//将横坐标方向的x值进行累加 
		sumx = sumx + x[i];
		//将纵坐标方向的y值进行累加 
		sumy = sumy + y[i];
		sumx2 = sumx2 + pow(x[i], 2.0);
		sumxy = sumxy + (x[i] * y[i]);
	}
	//根据公式求解b1和b0的值 
	b1 = (sumxy - ((sumx * sumy) / (double)n)) / (sumx2 - (pow(sumx, 2.0) / (double)n));
	b0 = (sumy - ((b1) * sumx)) / (double)n;
	return;
}

int main()
{
	cout << "输入数值点个数:" << endl;
	int n; cin >> n;
	cout << "请分别输入数值点(第一行为x,第二行为y)"<<endl;
	//double x[6];// = { 1,  2 ,  4 , 6 ,8,10 };
	//double y[6];// = { 1.8,3.7,8.2,12.0,15.8,20.2 };
	for (int i = 0; i < n; i++)cin >> x[i];
	for (int i = 0; i < n; i++)cin >> y[i];
	cal(n);
	cout << "最小二乘法计算结果: y=" << b0 << "+" << b1 << "x"<<endl;
	return 0;
}

然后解决了这个忽然来了精神(没错)

(原来debug真的会把人的精力耗尽啊)

=====解决vs失常问题

=====更新的题外话

zj要是知道他的作业我写了多久……又会被鄙视死吧=。=

不过还挺喜欢这种探索发现的感觉的……除了搞了半天搞不来之外,很喜欢最后accept的那种感觉哇

哇,想学的还有好多,要好好分配精力然后达到目标哇(晚上sql搞不好估计整个人精神又会崩溃……但是要是很顺利就up up啦 完成任务记得奖励自己么么叽)

(我刚刚得知zj大人又拿了个金奖……证书真耀眼啊0.0而我一份作业因为公式看不懂搜了一堆代码哎人与人之间的差距啊)

=====题外话

其实这两天还好,如果按任务量的计划来做的话感觉还挺有感觉的,很想把任务完成然后去app上打钩。

就是完不成……x 饭也不想吃。

想学的东西还有好多…… 导师让我们学python,tcp课要学c#,数据库我也很久没听过课。

唔,既然划定任务这个模式很适合自己……努力提高效率吧qwq各种东西都玩的熟练一点,

然后千万要记得给予奖励这一块!(我搞完自己作业的二分就去吃饭然后回去洗头然后看书晚上再去别的)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值