速战高斯消元

A:高斯消元,这难吗?

Q:不难,只要你会线性代数初等变换

A:没去学过?。。

Q:上B站看大神讲解,去上网易公开课,看百度,买本书自己啃……

 

前面都是为了鼓励你们自我学习所说的肺()腑()之言,当然这没有这么高大上

也不需要许多前置知识,只要你会十分水()的如何加减消元和代入消元(想当年我初中就这两个名词没写出来被扣了分。。

 

如何n个方程的解呢?

其实很简单,只需要用分治的思想

首先,n个未知数n的方程,把n-1个方程中的某个未知数用加减消元法消去,

问题就变成了n-1个方程n-1个未知数(降维打击),不就完事了吗?

然后再倒着进行代入消元法

时间O (n^{3}),愉快的结束了!!!

A:呵呵呵,怎么这么水?

Q:ORZ,大佬!

 

好了,根据传()统(B)的说法,这是维护一个上三角矩阵
维护完了以后再倒着做一遍

WOW,这也太难()了,你们还是自己啃书吧!

说真的,小学生都会了(我还不如小学生!

 

模板题

#include<cstdio>
#include<iostream>
#include<cmath> 
#define db double 
const db eps=1e-5;
using namespace std;

const int N=106;
int n;
db a[N][N],ans[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	for(int i=1;i<=n;i++)
	{
		if(abs(a[i][i])<=eps) 
		{
			bool f=0;
			for(int j=i+1;j<=n;j++)
				if(abs(a[j][i])>eps)
				{
					for(int k=i;k<=n+1;k++)
						swap(a[i][k],a[j][k]);
					f=1;
					break;
				}
			if(f==0)
			{
				puts("No Solution");
				return 0;
			} 
		}
		for(int j=i+1;j<=n;j++)
		{
			db b=a[i][i]/a[j][i];
			a[j][i]=0;
			for(int k=i+1;k<=n+1;k++) 
				a[j][k]=a[j][k]*b-a[i][k];
		}
	}
	for(int i=n;i>=1;i--)
	{
		ans[i]=a[i][n+1];
		for(int j=i+1;j<=n;j++)
			ans[i]-=a[i][j]*ans[j];
		ans[i]/=a[i][i];
	}
	for(int i=1;i<=n;i++)
		printf("%.2lf\n",ans[i]);
	return 0;
 } 

[SDOI2006]线性方程组

这同样是一道模板题

特别特别特别特别的快(恶)乐(心),比遇见风男还快乐

我们机房目前还没有一遍过的大佬。。

但不得不说这是到非常优秀的模板题,比Luogu上的模板题好无数倍

主要是他恶心恶心恶心再要判有无解,他的数据又灰常强势。

#include<cstdio>
#include<cmath>
#include<iostream>
#define db double
const db eps=1e-5;
using namespace std;

const int N=105;
int n,now;
bool f,ff;
db a[N][N],ans[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	now=1; //now 记录现在的消到了第几位 
	ff=0; 
	//判断是否有无解或者多解;
	//因为无解意味着必定会消到 0+0+0+0+……+0=c(c!=0)
	//多解意味着会消到0+0+0+……+0=0 
	for(int i=1;i<=n;i++)
	{
		f=0;
		while(now<=n&&abs(a[i][now])<=eps)
		{
			for(int j=i+1;j<=n;j++)
				if(abs(a[j][now])>eps) 
				{
					for(int k=now;k<=n+1;k++)	
						swap(a[i][k],a[j][k]);
					f=1;
					break;
				}
			if(f==0) 
			{
				now++;
				ff=1;  
			}
		}
		if(now>n) break;
		for(int j=i+1;j<=n;j++)
			if(abs(a[j][now])>eps) 
			{
				double b=a[i][now]/a[j][now];
				a[j][now]=0;
				for(int k=now+1;k<=n+1;k++)
					a[j][k]=a[j][k]*b-a[i][k];
			}
		now++;
		if(now>n) break;
	}
	if(ff==1)
	{ 
		for(int i=n;i;i--)
		{
			bool fff=0;
			for(int j=1;j<=n;j++)
				if(abs(a[i][j])>eps) 
				{
					fff=1;
					break;
				} 
			if(fff==1) break;
			//前面系数全是0 
			if(abs(a[i][n+1])>eps)
			{
				puts("-1");
				return 0;  
			} //判断无解
		//无解必须在前面判断,因为无解可能出现0+0+0+……+0=0; 
		}
		puts("0");
		return 0; 
	}
	for(int i=n;i;i--)
	{
		ans[i]=a[i][n+1];
		for(int j=i+1;j<=n;j++)
			ans[i]-=a[i][j]*ans[j];
		ans[i]/=a[i][i];
	}
	for(int i=1;i<=n;i++)
		printf("x%d=%.2lf\n",i,ans[i]);
	return 0;
}

 

[JSOI2008]球形空间产生器

很水的高斯消元,很容易写出n+1个方程

这些方程都带着平方,是不是感觉好恶(快)心(乐)?

每个方程与第一个相减,即可得到n个可以高斯消元的方程

如当n=2时,设球心为(x,y),即可得到

x(2x_2-2x_1)+y(2y_2-2y_1)=x_2^{2} -x_1^{2}+y_2^{2}-y_1^{2}

x(2x_3-2x_1)+y(2y_3-2y_1)=x_3^{2} -x_1^{2}+y_3^{2}-y_1^{2}

同理类推

#include<cstdio>
#include<iostream>
#include<cmath>
#define db double
const db eps=1e-6;
using namespace std;

const int N=20;
int n;
db b[N][N],a[N][N],ans[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;i++)
		for(int j=1;j<=n;j++)
			scanf("%lf",&b[i][j]);
	 for(int i=1;i<=n;i++)
	 	for(int j=1;j<=n;j++)
	 	{
	 		a[i][j]=(b[i+1][j]-b[1][j])*2;
	 		a[i][n+1]+=b[i+1][j]*b[i+1][j]-b[1][j]*b[1][j];
	 	}
	 for(int i=1;i<=n;i++)
	 {
		if(abs(a[i][i])<=eps)
			for(int j=i+1;j<=n;j++)
			{
				if(abs(a[j][i])>eps)
				{
					for(int k=i;k<=n+1;k++)
						swap(a[i][k],a[j][k]);
				}
				break;
			}
		for(int j=i+1;j<=n;j++)
			if(abs(a[j][i])>eps)
			{
				db t=a[i][i]/a[j][i];
				a[j][i]=0;
				for(int k=i+1;k<=n+1;k++)
					a[j][k]=a[j][k]*t-a[i][k];
			}
	 }
	 for(int i=n;i>=1;i--)
	 {
	 	ans[i]=a[i][n+1];
	 	for(int j=i+1;j<=n;j++)
	 		ans[i]-=ans[j]*a[i][j];
	 	ans[i]/=a[i][i];
	 }
	 for(int i=1;i<=n;i++)
	 	printf("%.3lf%c",abs(ans[i])<=eps?0.0:ans[i],i==n?'\n':' ');
	 return 0;
}

 

 

 

数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)内容概要:本文围绕“数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究”展开,提出了一种结合数据驱动与分布鲁棒优化方法的建模框架,用于解决电热综合能源系统在不确定性环境下的优化调度问题。研究采用两阶段优化结构,第一阶段进行预决策,第二阶段根据实际场景进行调整,通过引入1-范数和∞-范数约束来构建不确定集,有效刻画风电、负荷等不确定性变量的波动特性,提升模型的鲁棒性和实用性。文中提供了完整的Matlab代码实现,便于读者复现和验证算法性能,并结合具体案例分析了不同约束条件下系统运行的经济性与可靠性。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及工程技术人员,尤其适合从事综合能源系统、鲁棒优化、不确定性建模等相关领域研究的专业人士。; 使用场景及目标:①掌握数据驱动的分布鲁棒优化方法在综合能源系统中的应用;②理解1-范数和∞-范数在构建不确定集中的作用与差异;③学习两阶段鲁棒优化模型的建模思路与Matlab实现技巧,用于科研复现、论文写作或工程项目建模。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现细节,重点关注不确定集构建、两阶段模型结构设计及求解器调用方式,同时可尝试换数据或调整约束参数以加深对模型鲁棒性的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值